JPype 1.0.2 ์—…๋ฐ์ดํŠธ, Python์—์„œ Java ํด๋ž˜์Šค์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ƒˆ ๋ ˆ์ด์–ด ๋ฆด๋ฆฌ์Šค JPype 1.0.2, Java ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ์•ก์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Python์˜ JPype๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Java ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Java์™€ Python ์ฝ”๋“œ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Jython๊ณผ ๋‹ฌ๋ฆฌ Java์™€์˜ ํ†ตํ•ฉ์€ JVM์šฉ Python ๋ณ€ํ˜• ์ƒ์„ฑ์„ ํ†ตํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ƒ ๋จธ์‹  ์ˆ˜์ค€์—์„œ์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  CPython ๋ฐ Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฐฐํฌ์ž Apache 2.0์— ๋”ฐ๋ผ ๋ผ์ด์„ผ์Šค๊ฐ€ ๋ถ€์—ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ :

  • ์˜ค๋ฒ„๋กœ๋“œ ํ•ด๊ฒฐ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ์บ์‹œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํŠนํžˆ ๋ฃจํ”„์—์„œ์™€ ๊ฐ™์ด ๋™์ผํ•œ ์˜ค๋ฒ„๋กœ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ ๋ฉ”์„œ๋“œ ํ•ด๊ฒฐ์ด ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ํฌ๊ฒŒ ์ค„์˜€์Šต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋”ฐ๋ผ 4ํšŒ์—์„œ 100ํšŒ๊นŒ์ง€ ๋ชฉ๋ก, ํŠœํ”Œ ๋ฐ ๋ฒ„ํผ๋ฅผ Java ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ ๋ฐฐ์—ด๋กœ ์ „์†กํ•˜๋Š” ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. ๋ณ€ํ™˜์€ Sequence API ๋Œ€์‹  ์ตœ์ ํ™”๋œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฒ„ํผ ์ฒ˜๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Python ๋ฒ„ํผ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋งŒ ๋ณ€ํ™˜์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฒ„ํผ๋Š” ๋™์ข…์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์ข…๋ฃŒ ์ž‘์—… ์ฒ˜๋ฆฌ(JPype 1.0.0์—์„œ ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ ๋ณ€๊ฒฝ ๋กœ๊ทธ๋ฅผ ์ค€๋น„ํ•  ๋•Œ ๊ฑด๋„ˆ๋›ฐ์—ˆ์Šต๋‹ˆ๋‹ค). ์ด์ œ JPype๋Š” JVM์˜ ์ข…๋ฃŒ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ช‡ ๊ฐ€์ง€ ํ–‰๋™ ๋ณ€ํ™”๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ(ํ”„๋ก์‹œ ํ˜ธ์ถœ)๋Š” ์ด์ œ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ JVM์„ ์—ด์–ด ๋‘˜ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก์‹œ ํ˜ธ์ถœ์€ ํ˜ธ์ถœ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ข…๋ฃŒ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ์ค‘๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์ œ ์Šค๋ ˆ๋“œ๊ฐ€ ์˜ˆ์™ธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉด ํŒŒ์ผ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‹ซํžˆ๊ณ  ๋””์Šคํฌ๋กœ ํ”Œ๋Ÿฌ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ ํ›„ํฌ ๋ฐ ์ข…๋ฃŒ์ž๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด AtExit ํ›„ํฌ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. Python์—์„œ JVM์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ๋ชฌ์„ ํ†ตํ•ด ์ž๋™ ์Šค๋ ˆ๋“œ ์—ฐ๊ฒฐ์ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์ •๋ฆฌ๋ฅผ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ์ž˜๋ชป๋œ ์ฝ”๋“œ๋Š” ์ข…๋ฃŒ ์‹œ ์ค‘๋‹จ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ฌธ์„œ๋Š” ์‚ฌ์šฉ์ž ๊ฐ€์ด๋“œ์— ์žˆ์Šต๋‹ˆ๋‹ค.
  • Throwable์— ๋Œ€ํ•œ ๋ž˜ํผ๋Š” ์˜ˆ์ƒ ๊ฒฐ๊ณผ ๋Œ€์‹  Object์— ๋Œ€ํ•œ ๋ž˜ํผ๋ฅผ ๊ฐ€์ ธ์™”๊ณ , ์ด๋กœ ์ธํ•ด Python ํด๋ž˜์Šค์—์„œ ์ด์ƒํ•œ ๋ณ€ํ™˜์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
  • '"jname"์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ' ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ์‹œ์Šคํ…œ์˜ ์˜คํƒ€๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • KeyboardInterrupt์—์„œ "^C"๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์Šน๊ฒฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
  • Python 3.5.3์˜ ๋ฌธ์ž ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. PySlice_Unpack์€ ํ›„์† ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค(3.5.4)์— ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ ์‚ฌ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • numpy.linalg.inv์˜ ์ถฉ๋Œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” JVM๊ณผ ์ผ๋ถ€ numpy ๋ณ€ํ˜• ๊ฐ„์˜ ์Šค๋ ˆ๋“œ ์ƒํ˜ธ ์ž‘์šฉ์œผ๋กœ ์ถ”์ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ๋œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ JVM์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— numpy.linalg.inv๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€