์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
PyPy์˜ ์ƒ์ง•์ธ ์šฐ๋กœ๋ณด๋กœ์Šค ๋กœ๊ณ .
1. ๊ฐœ์š”2. ์ƒ์„ธ3. ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋‚˜4. JIT, ๊ทธ๋ฆฌ๊ณ  ๋งˆ๊ฐœ์กฐ5. ํ˜ธํ™˜์„ฑ
5.1. ๊ธฐ๋ถ€ ๋ชจ๊ธˆ
6. ์˜ˆ์ œ

PyPy ํ”„๋กœ์ ํŠธ ์‚ฌ์ดํŠธ

1. ๊ฐœ์š”[ํŽธ์ง‘]

2007๋…„์— ์ฒ˜์Œ ๋ฐœํ‘œ๋œ Python์˜ ์–ธ์–ด ๊ตฌํ˜„ ์ค‘ ํ•˜๋‚˜๋กœ, C๋กœ ์งœ์ธ ๊ธฐ์กด์˜ CPython๊ณผ ๋‹ฌ๋ฆฌ Python์œผ๋กœ Python์„ ๋งŒ๋“œ๋Š” ํ”„๋กœ์ ํŠธ์ด๋‹ค.[1] ์—ฌ๊ธฐ๋งŒ ๋ณด๋ฉด ๋ญ”๊ฐ€ ์ด์ƒํ•œ ์ง“ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์ง€ ์‹คํ—˜์ ์ธ ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ ๋А๊ปด์ง€๊ฒ ์ง€๋งŒ, ์ด ํ”„๋กœ์ ํŠธ์˜ ์ง„์งœ ๋†€๋ผ์šด ์ ์€ ๊ธฐ์กด CPython๋ณด๋‹ค ์ „ํ˜€ ๋А๋ฆฌ์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ, ์˜คํžˆ๋ ค ์„ฑ๋Šฅ๋ฉด์—์„œ CPython์„ ๋Šฅ๊ฐ€ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๋‚˜์•„๊ฐ€ ์ด ๋งํฌ์—์„œ ๋ณด์ด๋Š” ๋Œ€๋กœ, ๊ณ„์†ํ•ด์„œ ๋นจ๋ผ์ง€๊ณ  ์žˆ๋‹ค! ํ‘œ์ค€ ๊ตฌํ˜„์ธ CPython๊ณผ์˜ ์†๋„๋น„๊ต. PyPy๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ  ์žˆ๋‹ค.

2. ์ƒ์„ธ[ํŽธ์ง‘]

PyPy๋Š” ๋‹จ์ˆœํžˆ Python์„ ๊ฐ€์ง€๊ณ  ์žฅ๋‚œ์„ ํ•˜๋ ค๊ณ  ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•„๋‹ˆ๋‹ค. Psyco๋ผ๊ณ  ํ•˜๋Š”, ๊ธฐ์กด ํŒŒ์ด์ฌ ์œ„์—๋‹ค๊ฐ€ Just-In-Time ์ปดํŒŒ์ผ์„ ๊ตฌํ˜„ํ•ด์„œ ์‹คํ–‰์„ฑ๋Šฅ์„ ๋†’ํžˆ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด๊ฑธ ๊ฐœ๋ฐœํ•˜๋˜ Armin Rigo๋ผ๋Š” ์‚ฌ๋žŒ์ด ์•„์˜ˆ JIT ์ปดํŒŒ์ผ์„ ํ•˜๋Š” ํŒŒ์ด์ฌ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๊ธฐ๋กœ ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ 2003๋…„๋ถ€ํ„ฐ PyPy ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜์—ฌ ์œ ๋Ÿฝ์—ฐํ•ฉ์˜ ์—ฐ๊ตฌ์ž๊ธˆ ์ง€์›์„ ๋ฐ›์•„๊ฐ€๋ฉฐ ์ง€๊ธˆ๋„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค.

3. ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋‚˜[ํŽธ์ง‘]

์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐฉ์‹์˜ Python์„ ๊ฐ€์ง€๊ณ  ํŒŒ์ด์ฌ์œผ๋กœ ๋Œ๋ฆฌ๋Š” ํŒŒ์ด์ฌ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์—ˆ์„๊นŒ. PyPy์˜ ์ ‘๊ทผ๋ฒ•์€ ์ด๋ ‡๋‹ค.
  1. ๋จผ์ € RPython์ด๋ผ๊ณ  ํ•˜๋Š”, ํŒŒ์ด์ฌ ๋ฌธ๋ฒ•์„ ์—„๊ฒฉํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ปดํŒŒ์ผ์ด ๋˜๊ฒŒ ๋งŒ๋“  ํ•ด์„๊ธฐ(translate.py)๋ฅผ Python ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•œ๋‹ค.[2]
  2. RPython์˜ ํšจ๊ณผ์ ์ธ ์ปดํŒŒ์ผ์„ ์œ„ํ•ด ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ํˆด์ฒด์ธ์„ ๋งŒ๋“ ๋‹ค.[3]
  3. Python ๊ตฌํ˜„(๋Ÿฐํƒ€์ž„)์„ RPython ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  4. 3์—์„œ ๋งŒ๋“  ๊ตฌํ˜„์„ 1 ๋˜๋Š” 2์—์„œ ๋งŒ๋“  RPython ํ•ด์„๊ธฐ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค.
  5. 4์œผ๋กœ ๋งŒ๋“  ํ›„๋ณด๋ฅผ ์ด์ „ ๋˜๋Š” ๋‹ค๋ฅธ ๊ตฌํ˜„๊ณผ ๋น„๊ต(์„ฑ๋Šฅ ์ธก์ •), ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์œผ๋ฉด ์ˆ˜์ •ํ•œ๋‹ค.(nightly builds)
  6. 5์—์„œ ๋งŒ์กฑ์Šค๋Ÿฌ์šด ๊ฒฐ๊ณผ๋ฅผ ๋ƒˆ๋‹ค๋ฉด ์ถœ์‹œํ•˜๊ณ  1 ๋˜๋Š” 2๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.(release)
๋ญ”๊ฐ€ ์†๋Š” ๋А๋‚Œ์ด์ง€๋งŒ ์ฒ˜์Œ ํ•œ๋ฒˆ๋งŒ ๊ธฐ์กด ํŒŒ์ด์ฌ์˜ ๋„์›€์„ ๋ฐ›์œผ๋ฉด ๊ทธ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์Šค์Šค๋กœ ๋งŒ๋“  ๊ตฌํ˜„์œผ๋กœ ์ € ๊ณผ์ •์„ ์ž์ฒด์ ์œผ๋กœ ๊ณ„์† ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ๋กœ๊ณ ๊ฐ€ ์šฐ๋กœ๋ณด๋กœ์Šค์ธ ์…ˆ. ์ด๊ฒŒ ์–ผํ• ๋ณด๋ฉด '๋‹ญ์ด ๋จผ์ €๋ƒ ๋‹ฌ๊ฑ€์ด ๋จผ์ €๋ƒ' ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ฐฉ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ด๋Ÿฐ ์‹์˜ ์ ‘๊ทผ๋ฒ•์€ ์‹ค์ œ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ œ์ž‘ํ•  ๋•Œ ํ•ด๋‹น๋˜๋Š” ์‚ฌํ•ญ์ด๋ฉฐ[4], ๋” ์ข‹์€ ์žฅ๋น„์˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๊ธฐ์กด์˜ ์žฅ๋น„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฆ„์ด ์—†๋‹ค. ์งฑ๋Œ๋กœ ๋—€์„๊ธฐ๋ฅผ ๋งŒ๋“ค๊ณ , ๋—€์„๊ธฐ๋กœ ๊ฐ„์„๊ธฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ ์ธ๋ฅ˜ ์—ญ์‚ฌ์— ๊ณ ๊ณ ํžˆ ์ „ํ•ด์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜์ด๋ฏ€๋กœ ์†๋Š” ๋А๋‚Œ์„ ๊ฐ€์งˆ ํ•„์š”๋Š” ์ „ํ˜€ ์—†๋‹ค.

์ด๋Ÿฐ ์‹์œผ๋กœ ์–ด๋–ค ์–ธ์–ด๋กœ ์ž๊ธฐ ์ž์‹ ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํ•‘(Bootstrapping) ๋˜๋Š” ๋ถ€ํŒ…(Booting)[5]์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ƒ์‚ฐ์„ฑ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ์ž‘์—…ํ•˜๋ฉด ์ด๋ก ์ƒ ์ตœ๊ฐ•์˜ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜ ๊ทธ ๊ฐ€๋Šฅ์„ฑ์€ ๋งค์šฐ ๋‚ฎ๊ณ  ์ƒ์‚ฐ์„ฑ๋„ ์ตœ์•…์ด๋‹ค.(์ตœ์ ํ™”๊ฐ€ ๊ทธ๋ž˜์„œ ํž˜๋“ค๋‹ค.) ์ด ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋„ ์ดˆ์ฐฝ๊ธฐ์—๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋‚˜ ๋‹ค๋ฅธ ๊ณ ๊ธ‰์–ธ์–ด์˜ ๋„์›€์„ ๋ฐ›์ง€๋งŒ, ์ผ์ • ๋‹จ๊ณ„๋ฅผ ๋„˜์–ด์„œ๋ฉด์„œ ๋ฐœ์ „์— ํ•œ๊ณ„๊ฐ€ ์˜ค๋ฉด ์Šค์Šค๋กœ์˜ ์ปดํŒŒ์ผ๋Ÿฌ/์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค. Haskell ์ปดํŒŒ์ผ๋Ÿฌ์ธ GHC์™€ C/C++ ์ปดํŒŒ์ผ๋Ÿฌ์ธ GCC๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ. ๋ฌผ๋ก  ์ƒ์‚ฐ์„ฑ์— ์ค‘์ ์„ ๋‘๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ๋ˆˆ์— ๋„๊ฒŒ ๋นจ๋ผ์ง€๋Š” ์ผ์€ ๋“œ๋ฌผ๊ณ , ๋‹จ์ง€ ์šฐ์—ฐํ•œ ๋ฐœ๊ฒฌ ๋“ฑ ์—ฌ๋Ÿฌ ์ด์œ ๋กœ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. PyPy์˜ ๊ฒฝ์šฐ Python์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ •์ ์ธ ์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•œ RPython์„ ๋”ฐ๋กœ ๋งŒ๋“ค์—ˆ๊ณ  ๋’ค์—๋„ ํ›„์ˆ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด 7๋…„์ด๋ผ๋Š” ๊ธด ์„ธ์›”์„ ์†Œ๋ชจํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ๋„ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์งง์€ ๊ฒƒ์ด๋‹ค.[6]

4. JIT, ๊ทธ๋ฆฌ๊ณ  ๋งˆ๊ฐœ์กฐ[ํŽธ์ง‘]

PyPy๋Š” RPython์œผ๋กœ ์ด๋ฃจ์–ด์ง„ Python ์ธํ„ฐํ”„๋ฆฌํ„ฐ์™€ (์—ญ์‹œ RPython์œผ๋กœ ์ด๋ฃจ์–ด์ง„) C, .Net, JVM ๋“ฑ์„ ํƒ€๊ฒŒํŒ…ํ•œ ํ•ด์„ ํˆด์ฒด์ธ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”๋ฐ, ํ•ด์„ ํˆด์ฒด์ธ์€ ํ•ด๋‹น ํ”Œ๋žซํผ์„ ์œ„ํ•œ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์ดˆ์ ์ด ๋งž์ถฐ์ ธ ์žˆ์œผ๋ฉฐ, Tracing JIT์„ ํ†ตํ•ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋‹จ์œ„์˜ JIT ์ปดํŒŒ์ผ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, CPython๋ณด๋‹ค ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๋งŒ์ด์–ด๋„ ๊ทธ๋ƒฅ ๊ธฐ์กด ๊ตฌํ˜„๋ณด๋‹ค ๊ทธ๋‹ค์ง€ ๋А๋ฆฌ์ง€ ์•Š์€ ํŒŒ์ด์ฌ ๊ตฌํ˜„์„ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋„์›€ ์—†์ด ํŒŒ์ด์ฌ ์Šค์Šค๋กœ ๋งŒ๋“  ์…ˆ์ด์ง€๋งŒ, ์—ฌ๊ธฐ์„œ ํ•˜๋‚˜๊ฐ€ ๋” ๋“ค์–ด๊ฐ„๋‹ค. Armin Rigo๊ฐ€ ๋ญ ๋งŒ๋“ค๋˜ ์‚ฌ๋žŒ์ด๋ผ๋Š” ๋‚ด์šฉ์ด ์œ„์—๋„ ์žˆ์ง€๋งŒ PyPy๋Š” JIT compiler์ด๋‹ค. ๊ทธ๊ฒƒ๋„ ๊ทธ๋ƒฅ JIT๊ฐ€ ์•„๋‹ˆ๋ผ Meta tracing JIT๋ผ๋Š” ๊ดด๋ž„ํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, JIT์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ์•ฝ๊ฐ„์˜ ํžŒํŠธ ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด RPython ํ•ด์„๊ธฐ๊ฐ€ ์•Œ์•„์„œ JIT compile์ด ๋˜๋Š” ์–ธ์–ด ๊ตฌํ˜„์„ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด ๊ตฌํ˜„๋“ค์ด JIT ์ข€ ํ•ด๋ณด์ž๊ณ  ๋ฌด์ง€๋ง‰์ง€ํ•œ ์‚ฝ์งˆ์„ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ[7] ๊ฑฐ์˜ ๊ณต์งœ์™€ ๋‹ค๋ฆ„์—†๋‹ค.

ํ•˜์ง€๋งŒ, ์‚ฌ์‹ค ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ๋ณด๋‹ˆ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ด๋Š” ๊ฑฐ๊ณ  PyPy๋Š” ๊ทธ๋ƒฅ JIT๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ JIT ๊ตฌํ˜„์„ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•œ ์…ˆ์ด ๋˜๋ฏ€๋กœ ์‹ค์ œ ์ž‘์—…์€ ํ›จ์”ฌ ๋” ์–ด๋ ค์› ์„ ๊ฒƒ์ด๋‹ค. ๋‹น์žฅ PyPy๊ฐ€ CPython๋ณด๋‹ค ๋นจ๋ผ์ง„ ๊ฒŒ PyPy 1.3๋ถ€ํ„ฐ์ธ๋ฐ, ๊ทธ๊ฒŒ 2010๋…„ ์ค‘์ˆœ์ด๋‹ค.[8] ๋‹ค์‹œ ๋งํ•ด, 7๋…„ ๋™์•ˆ ์•„๋ฌด๋„ ์•Œ์•„์ฃผ์ง€ ์•Š๋˜ '์ง„ํ™”'๊ฐ€ ๋“œ๋””์–ด ๋น›์„ ๋ณธ ์…ˆ. ๊ทธ๋ฆฌ๊ณ  ๋ณธ์ธ๋“ค๋„ "์šฐ๋ฆฌ๋Š” ์˜์›…์ด ์•„๋‹ˆ๋ฉฐ, ๋‹จ์ง€ ์ธ๋‚ด์‹ฌ์ด ๋งŽ์•˜์„ ๋ฟ์ด๋‹ค."๋ผ๊ณ  ๋งํ•˜๊ณ  ์žˆ๋‹ค. ์ž ์‹œ PyPy ๊ฐœ๋ฐœํŒ€์˜ ๊ทผ์„ฑ์— ๊ฒฝ์˜๋ฅผ ํ‘œํ•˜์ž.

์—ฌ๋‹ด์œผ๋กœ, ์ด ๋…€์„์˜ ํ•ด์„์€ ์‚ฌ๋žŒ๋งŒ ํž˜๋“œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ปดํ“จํ„ฐ๋„ ํž˜๋“œ๋Š” ๋ชจ์–‘์ด๋‹ค. ์จ๋ณผ ์‚ฌ๋žŒ๋“ค์€ ์‹œ๊ฐ„์ด ๋‚จ์•„๋Œ๊ณ  ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ์–ด์ง€๊ฐ„ํžˆ ๊ณ ์‚ฌ์–‘์ด ์•„๋‹ˆ๋ผ๋ฉด ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ๊ฒƒ์„ ๋ฐ›์•„ ์‚ฌ์šฉํ•˜์ž. CPython์„ ํ†ตํ•œ Bootstrapping์— ์—„์ฒญ๋‚œ ์‹œ๊ฐ„๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•œ๋‹ค ์ค€๋น„๋ฌผ์ด ๋ชจ๋‘ ๊ฐ–์ถฐ์ง„ ์ƒํƒœ์—์„œ PyPy 2.2.1 ๋‹ฌ๋ž‘ ํ•˜๋‚˜๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ์— ๋ชจ์งˆ๋ผ ํŒŒ์ด์–ดํญ์Šค์™€ ๊ทธ๊ฒƒ์ด ์˜์กดํ•˜๋Š” ๋ชจ๋“  ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋“ค์„ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ฆฐ๋‹ค! Core i7 3.33GHz, ๋‹ค๋ฅธ ์ž‘์—… ๋ฐฉํ•ด ์—†์ด ์ฝ”์–ด 1๊ฐœ ํ’€์‚ฌ์šฉ, 8GB ๋žจ ๊ธฐ์ค€์œผ๋กœ ์ตœ์†Œ 3์‹œ๊ฐ„์€ ๊ฐ์˜คํ•ด์•ผ ํ•œ๋‹ค. 64๋น„ํŠธ CPython์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋‹ค ๋ณด๋ฉด Python ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๊ฐ€ ๋žจ์„ 5GB ๊ฐ€๊นŒ์ด ์ฒ˜๋ฌต์ฒ˜๋ฌตํ•˜๋Š” ๊ฒƒ๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ด๋Ÿฐ ๊ตฌ์กฐ๋กœ ๋งŒ๋“  ๋•๋ถ„์— ๋ณด๋„ˆ์Šค๋กœ, RPython ์ปดํŒŒ์ผ์„ ํ•  ๋•Œ ๋ชฉ์  ํƒ€๊ฒŸ์„ ๋‹ค๋ฅด๊ฒŒ ์ฃผ๋ฉด ๋‹ค๋ฅธ ํ”Œ๋žซํผ์œผ๋กœ๋„ ๋Œ์•„๊ฐ€๋Š” ํŒŒ์ด์ฌ ๊ตฌํ˜„์ด ๋‚˜์˜ค๊ณ , ๋˜‘๊ฐ™์€ PyPy ์†Œ์Šค์ฝ”๋“œ๋กœ CPython ๊ฐ™์€ ๊ฒƒ๋„ ๋‚˜์˜ค๋ฉฐ, Jython ๊ฐ™์€ ๊ฒƒ๋„, IronPython ๊ฐ™์€ ๊ฒƒ๋„ ๋‚˜์˜จ๋‹ค. ์ถ”๊ฐ€๋กœ ์ฝ”๋ฃจํ‹ด์„ ์“ฐ๋Š” Stackless Python ๊ฐ™์€ ๊ฒƒ๋„ ๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์„œ Stackless Python ๊ฐœ๋ฐœํ•˜๋˜ Christian Tismer๊ฐ€ ์•„์˜ˆ PyPy ๊ฐœ๋ฐœํŒ€์—์„œ ๊ฐ™์ด ์ผํ•˜๊ณ  ์žˆ๋‹ค.[9]

5. ํ˜ธํ™˜์„ฑ[ํŽธ์ง‘]

PyPy ๊ฐœ๋ฐœํŒ€์˜ ํ˜ธํ™˜์„ฑ ๊ธฐ์ค€์€ ๋งค์šฐ ์‹ฌํ”Œํ•ด์„œ, ์ด์œ  ์—ฌํ•˜๋ฅผ ๋ง‰๋ก ํ•˜๊ณ  CPython์—์„œ ๋˜๋Š” ๊ฒŒ PyPy์—์„œ ์•ˆ ๋˜๋ฉด ๊ทธ๋ƒฅ PyPy ๋ฒ„๊ทธ๋‹ค. C ํ™•์žฅ๋ชจ๋“ˆ ์“ด ์ฝ”๋“œ ๋นผ๊ณ ๋Š” ๊ฑฐ์˜ ๋Œ์•„๊ฐ„๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. Python 3๋Š” ๊ฐˆ๊ธธ์ด ๋ฉ€๋‹ค. ์ถ”๊ฐ€ํ•  ๊ธฐ๋Šฅ์— ์ฝ”๋ฃจํ‹ด์ด ์žˆ๋Š” ๊ฑด ๋ค.

PyPy๋Š” ๊ตฌ์กฐ์  ๋ฌธ์ œ๋กœ ์ธํ•ด์„œ 64๋น„ํŠธ ์œˆ๋„์šฐ์šฉ์œผ๋กœ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์—†๋‹ค. 32๋น„ํŠธ์šฉ์œผ๋กœ๋Š” ์ œ๊ณต๋˜๋ฏ€๋กœ ์œˆ๋„์šฐ์™€์˜ ํ˜ธํ™˜์„ฑ์— ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. #

5.1. ๊ธฐ๋ถ€ ๋ชจ๊ธˆ[ํŽธ์ง‘]

ํ˜„์žฌ PyPy ์‚ฌ์ดํŠธ์—์„œ Python 3.x์™€์˜ ํ˜ธํ™˜์„ฑ๊ณผ NumPy ์ง€์›์„ ์œ„ํ•œ ๊ธฐ๋ถ€๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ค.

NumPy๋Š” ์†๋„ ๋ฌธ์ œ ๋•Œ๋ฌธ์— C ํ™•์žฅ์„ ์“ด ๋Œ€ํ‘œ์ ์ธ ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ž, ๊ณผํ•™๊ณ„์‚ฐ ๋ถ„์•ผ์—์„œ ์“ฐ์ด๋Š” ํŒŒ์ด์ฌ ์ฝ”๋“œ์—์„œ ์ ˆ๋Œ€์ ์ธ ์˜ํ–ฅ์„ ๊ฐ€์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ํ•˜์ง€๋งŒ PyPy๋Š” ๋•Œ๋•Œ๋กœ C๋กœ ์ง  ์ฝ”๋“œ๋ณด๋‹ค๋„ ๋นจ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์— PyPy ์ธก์—์„œ๋Š” ์•„์˜ˆ NumPy๋ฅผ ์ˆœ์ˆ˜ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ ์žฌ์ž‘์„ฑํ•  ๊ณ„ํš์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

NumPy ์ชฝ์€ ์ด๋ฏธ ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉ์— ์ง€์žฅ์ด ์—†๋Š” ์ˆ˜์ค€๊นŒ์ง€ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ . #[10]

6. ์˜ˆ์ œ[ํŽธ์ง‘]

๋ชฌํ‹ฐ ํ™€ ๋ฌธ์ œ๋กœ ํ…Œ์ŠคํŠธ ํ•ด ๋ณด์ž.
import random
def populate_doors(): # put a car behind one door
	door=['goat', 'goat', 'goat']
	door[random.randint(0,2)]='car'
	return door
wins = 0
losses = 0
# playing the game 100,000 times:
for x in range(100000):
	doors=populate_doors()
	first_choice=random.randint(0,2) # choose a random door
	for y in range(3): # reveal first losing, unchosen door
		if doors[y] != 'car' and y != first_choice:
			doors[y] = 'out'
			break
	if doors[first_choice] == 'car':
		losses = losses + 1 # contestant switched to losing door
	else:
		wins = wins + 1 # contestant switched to winning door
print ("All choices were switched.")
print ("Wins:"), wins
print ("Losses:"), losses

์ฝ”๋“œ ์ถœ์ฒ˜: http://www.danielveazey.com/tag/monty-hall-problem/

PyPy๊ฐ€ ์•ฝ 25๋ฐฐ[11] ๋น ๋ฅด๋‹ค. ๋ฌผ๋ก  ์ฝ”๋“œ์— ๋”ฐ๋ผ ๋ฐฐ์œจ์— ์ฐจ์ด๊ฐ€ ์žˆ๊ณ  ๊ฐ€๋”์”ฉ ๋” ๋А๋ฆฐ ์ฝ”๋“œ๋„ ์žˆ์ง€๋งŒ ์–ด์ง€๊ฐ„ํ•œ ๊ฒฝ์šฐ์—” PyPy์ชฝ์ด ๋น ๋ฅด๋‹ค.
[1] ๋ถ€ํŠธ์ŠคํŠธ๋ž˜ํ•‘์ด๋ผ๊ณ  ํ•œ๋‹ค.
[2] RPython๋Š” Python์˜ ์ผ๋ถ€๋งŒ ๊ตฌํ˜„ํ•œ ์–ธ์–ด(๋ถ€๋ถ„ ์–ธ์–ด)์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  RPython ์ฝ”๋“œ๋Š” Python ์ฝ”๋“œ์ด๊ธฐ๋„ ํ•˜๋‹ค. (๋ฐ˜๋Œ€๋Š” ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค.)
[3] ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋‚˜ ์—๋ฎฌ๋ ˆ์ดํ„ฐ๋ฅผ ์ œ์ž‘ํ•˜๋Š” ๋•Œ์—๋„ ์ด ๊ณผ์ •์„ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์นœ๋‹ค.
[4] ์ผ๋ก€๋กœ ์œ ๋ช… C/C++ ์ปดํŒŒ์ผ๋Ÿฌ์ธ GCC๋„ C/C++๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค. ํŒŒ์ด์ฌ์ด ์Šคํฌ๋ฆฝํŒ… ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๊ฒฌ ํŠน์ดํ•ด๋ณด์ด๋Š” ๊ฒƒ์ผ ๋ฟ, ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ์–ด์ฐจํ”ผ ์ปดํŒŒ์ผ๋œ ์ƒํƒœ๋กœ ๋Œ์•„๊ฐ€๋ฏ€๋กœ ๊ฐ™์€ ์›๋ฆฌ๋‹ค.
[5] ์šด์˜์ฒด์ œ์˜ ๋ถ€ํŒ…๊ณผ ๊ฐ™์€ ์–ด์›์ด๋‹ค.
[6] ์ปดํ“จํ„ฐ ํ•˜๋“œ์›จ์–ด์˜ ๋ฐœ์ „๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ์ฒ˜์Œ IC๋‚˜ LSI๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์†์œผ๋กœ ๊ทธ๋ ธ์ง€๋งŒ, ์ง€๊ธˆ ๋‚˜์˜ค๋Š” ์นฉ๋“ค์€ ์†์œผ๋กœ ํ•˜๊ธฐ์—๋Š” ํšŒ๋กœ์˜ ๊ทœ๋ชจ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์ „๋ถ€ CAD๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ๋‹ค.
[7] ์ธํ„ฐํ”„๋ฆฌํŠธ๋‚˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ปดํŒŒ์ผ ๋ฐฉ์‹์„ ๊ฐ€์ง€๋Š” ์–ธ์–ด ๊ตฌํ˜„ ์‚ฌ์ด์— JIT๋ฅผ ์‹ค์šฉ์ ์œผ๋กœ ํ•˜๋Š” ๊ตฌํ˜„์€ JVM์ด๋‚˜ .NET Framework|.NET CLR ์ •๋„๋ฐ–์— ์—†๋‹ค. ๋‘˜ ๋‹ค ๋ˆ ์ข€ ์“ฐ๊ณ  ๋‹ค๋‹ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ค์ง€ ์•Š๋Š”๊ฐ€?
[8] ์œ„์—๋„ ์žˆ์ง€๋งŒ 2003๋…„์— ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ๋‹ค.
[9] ์—ฌ๋‹ด์ด์ง€๋งŒ ์ด ๋‘ ์‚ฌ๋žŒ์ด ๋ชจ์—ฌ์„œ ๋งŒ๋“  ๋˜ ํ•˜๋‚˜์˜ ์ž‘ํ’ˆ์ด greenlet์ธ๋ฐ, Psyco์ฒ˜๋Ÿผ ๊ธฐ์กด์˜ CPython์—๋‹ค๊ฐ€ ๋งˆ๊ฐœ์กฐ๋ฅผ ํ•ด์„œ ์›๋ž˜ ์ง€์› ์•ˆ ๋˜๋Š” ์ฝ”๋ฃจํ‹ด์„ ๋งŒ๋“ค์–ด ์˜ฌ๋ฆฌ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค... ์ฐธ๊ณ . ์ถ”๊ฐ€์ ์œผ๋กœ, ์ฝ”๋ฃจํ‹ด์€ ํŒŒ์ด์ฌ 3.4๋ถ€ํ„ฐ ๋‚ด์žฅ๋˜๋ฉฐ, 3.5๋ถ€ํ„ฐ๋Š” async๊ณผ await์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋„ ํƒ‘์žฌ๋œ๋‹ค.
[10] numpy๊ด€๋ จ ๊ธฐ๋ถ€ ๋ชจ๊ธˆ์€ ํ˜„์žฌ ๋‹ซํžŒ ์ƒํƒœ์ด๋‹ค.Call for donations - PyPy to support Numpy!
[11] Python 2.7.11 x86_64, PyPy 5.1.0 x86_64 ๊ธฐ์ค€.