๋ถ๋ฅ:ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
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์ ์ ๊ทผ๋ฒ์ ์ด๋ ๋ค.
- ๋จผ์ RPython์ด๋ผ๊ณ ํ๋, ํ์ด์ฌ ๋ฌธ๋ฒ์ ์๊ฒฉํ๊ฒ ๋ง๋ค์ด ์ปดํ์ผ์ด ๋๊ฒ ๋ง๋ ํด์๊ธฐ(translate.py)๋ฅผ Python ์ฝ๋๋ก ์์ฑํ๋ค.[2]
- RPython์ ํจ๊ณผ์ ์ธ ์ปดํ์ผ์ ์ํด ๋ค๋ฅธ ์ธ์ด๋ก ํด์ฒด์ธ์ ๋ง๋ ๋ค.[3]
- Python ๊ตฌํ(๋ฐํ์)์ RPython ๋ฌธ๋ฒ์ผ๋ก ์์ฑํ๋ค.
- 3์์ ๋ง๋ ๊ตฌํ์ 1 ๋๋ 2์์ ๋ง๋ RPython ํด์๊ธฐ๋ก ์ปดํ์ผํ๋ค.
- 4์ผ๋ก ๋ง๋ ํ๋ณด๋ฅผ ์ด์ ๋๋ ๋ค๋ฅธ ๊ตฌํ๊ณผ ๋น๊ต(์ฑ๋ฅ ์ธก์ ), ๋ง์กฑ์ค๋ฝ์ง ์์ผ๋ฉด ์์ ํ๋ค.(nightly builds)
- 5์์ ๋ง์กฑ์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฅผ ๋๋ค๋ฉด ์ถ์ํ๊ณ 1 ๋๋ 2๋ถํฐ ๋ค์ ์์ํ๋ค.(release)
์ด๋ฐ ์์ผ๋ก ์ด๋ค ์ธ์ด๋ก ์๊ธฐ ์์ ์ ๊ตฌํํ๋ ๊ฒ์ ๋ถํธ์คํธ๋ํ(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]
์ฌ๊ธฐ๊น์ง๋ง์ด์ด๋ ๊ทธ๋ฅ ๊ธฐ์กด ๊ตฌํ๋ณด๋ค ๊ทธ๋ค์ง ๋๋ฆฌ์ง ์์ ํ์ด์ฌ ๊ตฌํ์ ๋ค๋ฅธ ์ธ์ด์ ๋์ ์์ด ํ์ด์ฌ ์ค์ค๋ก ๋ง๋ ์ ์ด์ง๋ง, ์ฌ๊ธฐ์ ํ๋๊ฐ ๋ ๋ค์ด๊ฐ๋ค. 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 ๊ฐ๋ฐํ์ ๊ทผ์ฑ์ ๊ฒฝ์๋ฅผ ํํ์.
์ฌ๋ด์ผ๋ก, ์ด ๋ ์์ ํด์์ ์ฌ๋๋ง ํ๋๋ ๊ฒ ์๋๋ผ ์ปดํจํฐ๋ ํ๋๋ ๋ชจ์์ด๋ค. ์จ๋ณผ ์ฌ๋๋ค์
๊ทธ๋๋ ์ด๋ฐ ๊ตฌ์กฐ๋ก ๋ง๋ ๋๋ถ์ ๋ณด๋์ค๋ก, RPython ์ปดํ์ผ์ ํ ๋ ๋ชฉ์ ํ๊ฒ์ ๋ค๋ฅด๊ฒ ์ฃผ๋ฉด ๋ค๋ฅธ ํ๋ซํผ์ผ๋ก๋ ๋์๊ฐ๋ ํ์ด์ฌ ๊ตฌํ์ด ๋์ค๊ณ , ๋๊ฐ์ PyPy ์์ค์ฝ๋๋ก CPython ๊ฐ์ ๊ฒ๋ ๋์ค๋ฉฐ, Jython ๊ฐ์ ๊ฒ๋, IronPython ๊ฐ์ ๊ฒ๋ ๋์จ๋ค. ์ถ๊ฐ๋ก ์ฝ๋ฃจํด์ ์ฐ๋ Stackless Python ๊ฐ์ ๊ฒ๋ ๋น์ทํ ๋ฐฉ๋ฒ์ผ๋ก ๋ง๋ค ์ ์์ด์ Stackless Python ๊ฐ๋ฐํ๋ Christian Tismer๊ฐ ์์ PyPy ๊ฐ๋ฐํ์์ ๊ฐ์ด ์ผํ๊ณ ์๋ค.[9]
5. ํธํ์ฑ[ํธ์ง]
PyPy ๊ฐ๋ฐํ์ ํธํ์ฑ ๊ธฐ์ค์ ๋งค์ฐ ์ฌํํด์, ์ด์ ์ฌํ๋ฅผ ๋ง๋ก ํ๊ณ CPython์์ ๋๋ ๊ฒ PyPy์์ ์ ๋๋ฉด ๊ทธ๋ฅ PyPy ๋ฒ๊ทธ๋ค. C ํ์ฅ๋ชจ๋ ์ด ์ฝ๋ ๋นผ๊ณ ๋ ๊ฑฐ์ ๋์๊ฐ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. Python 3๋ ๊ฐ๊ธธ์ด ๋ฉ๋ค. ์ถ๊ฐํ ๊ธฐ๋ฅ์ ์ฝ๋ฃจํด์ด ์๋ ๊ฑด ๋ค.
PyPy๋ ๊ตฌ์กฐ์ ๋ฌธ์ ๋ก ์ธํด์ 64๋นํธ ์๋์ฐ์ฉ์ผ๋ก ์ปดํ์ผ ํ ์ ์๋ค. 32๋นํธ์ฉ์ผ๋ก๋ ์ ๊ณต๋๋ฏ๋ก ์๋์ฐ์์ ํธํ์ฑ์ ํฐ ๋ฌธ์ ๊ฐ ๋์ง๋ ์๋๋ค. #
PyPy๋ ๊ตฌ์กฐ์ ๋ฌธ์ ๋ก ์ธํด์ 64๋นํธ ์๋์ฐ์ฉ์ผ๋ก ์ปดํ์ผ ํ ์ ์๋ค. 32๋นํธ์ฉ์ผ๋ก๋ ์ ๊ณต๋๋ฏ๋ก ์๋์ฐ์์ ํธํ์ฑ์ ํฐ ๋ฌธ์ ๊ฐ ๋์ง๋ ์๋๋ค. #
5.1. ๊ธฐ๋ถ ๋ชจ๊ธ[ํธ์ง]
ํ์ฌ PyPy ์ฌ์ดํธ์์ Python 3.x์์ ํธํ์ฑ๊ณผ NumPy ์ง์์ ์ํ ๊ธฐ๋ถ๋ฅผ ๋ฐ๊ณ ์๋ค.
NumPy๋ ์๋ ๋ฌธ์ ๋๋ฌธ์ C ํ์ฅ์ ์ด ๋ํ์ ์ธ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์, ๊ณผํ๊ณ์ฐ ๋ถ์ผ์์ ์ฐ์ด๋ ํ์ด์ฌ ์ฝ๋์์ ์ ๋์ ์ธ ์ํฅ์ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ํ์ง๋ง PyPy๋ ๋๋๋ก C๋ก ์ง ์ฝ๋๋ณด๋ค๋ ๋นจ๋ผ์ง๊ธฐ ๋๋ฌธ์ PyPy ์ธก์์๋ ์์ NumPy๋ฅผ ์์ ํ์ด์ฌ ์ฝ๋๋ก ์ฌ์์ฑํ ๊ณํ์ ๊ฐ์ง๊ณ ์๋ค.
NumPy ์ชฝ์ ์ด๋ฏธ ๋๋ถ๋ถ ์ฌ์ฉ์ ์ง์ฅ์ด ์๋ ์์ค๊น์ง ๊ตฌํํ๋ค๊ณ . #[10]
NumPy๋ ์๋ ๋ฌธ์ ๋๋ฌธ์ C ํ์ฅ์ ์ด ๋ํ์ ์ธ ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด์, ๊ณผํ๊ณ์ฐ ๋ถ์ผ์์ ์ฐ์ด๋ ํ์ด์ฌ ์ฝ๋์์ ์ ๋์ ์ธ ์ํฅ์ ๊ฐ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ํ์ง๋ง PyPy๋ ๋๋๋ก C๋ก ์ง ์ฝ๋๋ณด๋ค๋ ๋นจ๋ผ์ง๊ธฐ ๋๋ฌธ์ PyPy ์ธก์์๋ ์์ NumPy๋ฅผ ์์ ํ์ด์ฌ ์ฝ๋๋ก ์ฌ์์ฑํ ๊ณํ์ ๊ฐ์ง๊ณ ์๋ค.
NumPy ์ชฝ์ ์ด๋ฏธ ๋๋ถ๋ถ ์ฌ์ฉ์ ์ง์ฅ์ด ์๋ ์์ค๊น์ง ๊ตฌํํ๋ค๊ณ . #[10]
6. ์์ [ํธ์ง]
๋ชฌํฐ ํ ๋ฌธ์ ๋ก ํ
์คํธ ํด ๋ณด์.
์ฝ๋ ์ถ์ฒ: http://www.danielveazey.com/tag/monty-hall-problem/
PyPy๊ฐ ์ฝ 25๋ฐฐ[11] ๋น ๋ฅด๋ค. ๋ฌผ๋ก ์ฝ๋์ ๋ฐ๋ผ ๋ฐฐ์จ์ ์ฐจ์ด๊ฐ ์๊ณ ๊ฐ๋์ฉ ๋ ๋๋ฆฐ ์ฝ๋๋ ์์ง๋ง ์ด์ง๊ฐํ ๊ฒฝ์ฐ์ PyPy์ชฝ์ด ๋น ๋ฅด๋ค.
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 ๊ธฐ์ค.