Community

๐Ÿš€Python JIT(Just-in_Time)์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์‹คํ–‰์‹œ๊ฐ„ ์ตœ์ ํ™”

์•„๋งˆ JIT์— ๋Œ€ํ•ด ์ž๋ฐ”๋ฅผ ๊ฒฝํ—˜ํ•˜์…จ๋˜ ๋ถ„๋“ค์€ ์ด๋ฏธ ์•„์‹œ๋Š” ๋ถ„๋“ค๋„ ๋งŽ์œผ์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ” ์—ญ์‹œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์ด๊ณ  ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด JIT์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Python ๋˜ํ•œ, ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด๋กœ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ์— ํ•œ์ค„์”ฉ ์ฝ์–ด ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๋งค๋ฒˆ ์ฝ”๋“œ๋ฅผ ํƒ‘์žฌํ•˜๊ณ , ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๋‹ค๋ณด๋‹ˆ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์— ๋น„ํ•ด ์‹คํ–‰์†๋„๊ฐ€ ๋А๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ˜•ํƒœ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” Just-In-Time ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋งŽ์€ ๊ฐœ์„ ํšจ๊ณผ๋ฅผ ์–ป์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿš€ JIT์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋น ๋ฅธ ์ด์œ . JIT์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋งค๋ฒˆ ํ•ด์„ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ์ฒ˜์Œ ์‹คํ–‰๋ ๋•Œ ์ธํ„ฐํ”„๋ฆฌํŠธ ๋ฐฉ์‹์œผ๋กœ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,์บ์‹ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํ”„๋ฆฌํ„ฐ์˜ ๋А๋ฆฐ ์‹คํ–‰ ์†๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (* ์ฐธ๊ณ : JAVA์˜ ๊ฒฝ์šฐ Method์˜์—ญ์— ์žˆ๋Š” ์ฝ”๋“œ ์บ์‹œ(Code Cache) ๊ณต๊ฐ„์— JIT๋กœ ์ปดํŒŒ์ผ๋œ ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๋ฅผ ์บ์‹ฑ) ๐Ÿ•น Python์—์„œ JIT์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• Python์—์„œ๋„ JIT์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. โ–ถ๏ธ PyPy(https://www.pypy.org) โ–ถ๏ธ Numba(https://numba.pydata.org) โœ… PyPy (https://www.pypy.org/download.html) ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์ธ CPython์„ ๋Œ€์ฒดํ•˜๋Š” ๊ตฌํ˜„์ฒด์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” 3.9๋ฒ„์ „์ด ๋‚˜์™€์žˆ์œผ๋ฉฐ, CPyhon3.7๋ณด๋‹ค ์•ฝ 4.9๋ฐฐ ๋น ๋ฅด๋‹ค๊ณ  ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ pypy์„ ์›ํ•˜๋Š” ๋ฒ„์ „์œผ๋กœ ๋‹ค์šด๋ฐ›์•„ ์„ค์น˜ํ•œ ํ›„์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์‹คํ–‰ํ•˜๋˜ ๋ฐฉ์‹์ธ python test.py >> pypy test.py ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Python์— ๋น„ํ•ด ์ž์ฃผ์“ฐ๋Š” ์ฝ”๋“œ๋ฅผ ์บ์‹ฑํ•ด์„œ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์—ฌ๋Ÿฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋‹จ์ ์œผ๋กœ ๋งŽ์ด ์–ธ๊ธ‰๋˜๋„ค์š” โœ… Numba(http://numba.pydata.org/numba-doc/latest/index.html) ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” PyPy๋ณด๋‹ค ๊ณ ๋ คํ• ๊ฒŒ ์ ๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. numba๋ฅผ requirments.txt์— ์ถ”๊ฐ€, pip install์„ ํ†ตํ•ด์„œ ์„ค์น˜๋ฅผ ํ•˜๋ฉด๋˜์–ด ์•„์ฃผ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Numba์€ LLVM(Low Level Virtual Machine)์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ด์šฉํ•ด, ์ˆ˜์น˜ ์—ฐ์‚ฐ์„ ๊ฐ€์†ํ™”ํ•ด์ฃผ๋ฉฐ, ํŠนํžˆ Numpy์ฝ”๋“œ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. PyPy์ฒ˜๋Ÿผ ์ „์ฒด ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ํ•ด์ฃผ์ง€๋Š” ๋ชปํ•˜๋‚˜, ์กฐ๊ฐ ์ฝ”๋“œ๋‚˜ ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ์ฝ”๋“œ ์ตœ์ ํ™”๋ฅผ ํ• ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. numba๋ฅผ importํ•œํ›„, ๋‚ด๊ฐ€ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ ํ•จ์ˆ˜์— ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ @jit๋˜๋Š” @njit๋ฅผ ์…‹ํŒ…์„ ํ•ด์ฃผ๋ฉด๋ฉ๋‹ˆ๋‹ค. (*์˜ˆ์‹œ ์ฝ”๋“œ ์ฐธ์กฐ, ์ฝ”๋“œ ์‹คํ–‰์‹œ๊ฐ„์€ ์Šคํฌ๋ฆฐ์ƒท๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ๋ณด์…”์•ผ ์ œ๋Œ€๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.) ๋‹จ์ ์ด๋ผ๋ฉด, ํˆด ์ฒด์ธ์œผ๋กœ, LLVM์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ์— ์˜์กด๊ด€๊ณ„์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ’ก๐Ÿ’ก๐Ÿ’ก ์‚ฌ์‹ค Python์—์„œ๋Š” Cython์„ ์ด์šฉํ•œ๋‹ค๋˜์ง€, C,C++์„ ํ™œ์šฉํ•˜๋Š” ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹คํ–‰์‹œ๊ฐ„์„ ์ตœ์ ํ™”ํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•๋“ค์ด ์˜ค๋Š˜ ๋ง์”€๋“œ๋ฆฐ ๋ฐฉ๋ฒ•๋“ค๋ณด๋‹ค๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๋ณต์žกํ•˜๊ณ  ๋‹ค์†Œ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ์— ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, PyPy์€ ์ฝ”๋“œ ์ˆ˜์ •์—†์ด ์†๋„ ํ–ฅ์ƒ์„ ์ด๋ฃฐ์ˆ˜ ์žˆ์œผ๋ฉฐ, Numba์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์ถ”๊ฐ€๋งŒ์œผ๋กœ ์„ฑ๋Šฅํ–ฅ์ƒ์„ ์ด๋ฃฐ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“š Reference https://towardsdatascience.com/this-decorator-will-make-python-30-times-faster-715ca5a66d5f https://namu.wiki/w/JIT#fn-2 https://hongl.tistory.com/204 https://strawberry.report/python-code-optimization/ https://numba.pydata.org https://www.pypy.org

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค