Python λ°μ΄νΈμ½λ νΌν μ΅μ νμ κ°λ ₯ν¨μ νꡬν©λλ€. μ±λ₯ ν₯μ, μ½λ ν¬κΈ° κ°μ, μ€ν μ΅μ ν λ°©λ²μ λ°°μ°μΈμ. μ€μ©μ μΈ μμκ° ν¬ν¨λμ΄ μμ΅λλ€.
Python μ»΄νμΌλ¬ μ΅μ ν: λ°μ΄νΈμ½λ νΌν μ΅μ ν κΈ°λ²
λ°μ΄λ κ°λ μ±κ³Ό μ¬μ© νΈμμ±μΌλ‘ μ λͺ ν Pythonμ μ’ μ’ Cλ C++μ κ°μ μ μμ€ μΈμ΄μ λΉν΄ μ±λ₯ λ©΄μμ λΉνμ λ°κΈ°λ ν©λλ€. μ΄λ¬ν μ°¨μ΄μλ μ¬λ¬ μμΈμ΄ μμ§λ§, Python μΈν°ν리ν°κ° ν΅μ¬μ μΈ μν μ ν©λλ€. Python μ»΄νμΌλ¬κ° μ½λλ₯Ό μ΄λ»κ² μ΅μ ννλμ§ μ΄ν΄νλ κ²μ μ ν리μΌμ΄μ ν¨μ¨μ±μ ν₯μμν€λ €λ κ°λ°μμκ² νμμ μ λλ€.
μ΄ κΈμ Python μ»΄νμΌλ¬κ° μ¬μ©νλ μ£Όμ μ΅μ ν κΈ°λ² μ€ νλμΈ λ°μ΄νΈμ½λ νΌν μ΅μ νλ₯Ό μμΈν λ€λ£Ήλλ€. μ΄κ²μ΄ 무μμΈμ§, μ΄λ»κ² μλνλμ§, κ·Έλ¦¬κ³ Python μ½λλ₯Ό λ λΉ λ₯΄κ³ κ°κ²°νκ² λ§λλ λ° μ΄λ»κ² κΈ°μ¬νλμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
Python λ°μ΄νΈμ½λ μ΄ν΄νκΈ°
νΌν μ΅μ νλ₯Ό μμΈν μ΄ν΄λ³΄κΈ° μ μ, Python λ°μ΄νΈμ½λλ₯Ό μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. Python μ€ν¬λ¦½νΈλ₯Ό μ€ννλ©΄ μΈν°ν리ν°λ λ¨Όμ μμ€ μ½λλ₯Ό λ°μ΄νΈμ½λλΌλ μ€κ° ννμΌλ‘ λ³νν©λλ€. μ΄ λ°μ΄νΈμ½λλ Python κ°μ λ¨Έμ (PVM)μ μν΄ μ€νλλ λͺ λ Ήμ΄ μ§ν©μ λλ€.
dis λͺ¨λ(λμ€μ΄μ
λΈλ¬)μ μ¬μ©νμ¬ Python ν¨μμ λν΄ μμ±λ λ°μ΄νΈμ½λλ₯Ό κ²μ¬ν μ μμ΅λλ€:
import dis
def add(a, b):
return a + b
dis.dis(add)
μΆλ ₯μ λ€μκ³Ό μ μ¬ν κ²μ λλ€(Python λ²μ μ λ°λΌ μ½κ° λ€λ₯Ό μ μμ):
4 0 LOAD_FAST 0 (a)
2 LOAD_FAST 1 (b)
4 BINARY_OP 0 (+)
6 RETURN_VALUE
λ€μμ λ°μ΄νΈμ½λ λͺ λ Ήμ΄μ λν μ€λͺ μ λλ€:
LOAD_FAST: μ§μ λ³μλ₯Ό μ€νμ λ‘λν©λλ€.BINARY_OP: μ€νμ μμ λ μμλ₯Ό μ¬μ©νμ¬ μ΄μ§ μ°μ°(μ΄ κ²½μ° λ§μ )μ μνν©λλ€.RETURN_VALUE: μ€νμ μ΅μλ¨ κ°μ λ°νν©λλ€.
λ°μ΄νΈμ½λλ νλ«νΌ λ 립μ μΈ ννμΌλ‘, Python μ½λκ° Python μΈν°ν리ν°κ° μλ λͺ¨λ μμ€ν μμ μ€νλ μ μλλ‘ ν©λλ€. νμ§λ§ λμμ μ΅μ ν κΈ°νκ° λ°μνλ κ³³μ΄κΈ°λ ν©λλ€.
νΌν μ΅μ νλ 무μμΈκ°?
νΌν μ΅μ νλ ν λ²μ μμ "μ°½"(λλ "νΌν")μ λ°μ΄νΈμ½λ λͺ λ Ήμ΄λ₯Ό κ²μ¬νμ¬ μλνλ κ°λ¨νμ§λ§ ν¨κ³Όμ μΈ μ΅μ ν κΈ°λ²μ λλ€. μ΄λ λ ν¨μ¨μ μΈ λμμΌλ‘ λ체λ μ μλ νΉμ λͺ λ Ήμ΄ ν¨ν΄μ μ°Ύμ΅λλ€. ν΅μ¬ μμ΄λμ΄λ μ€λ³΅λκ±°λ λΉν¨μ¨μ μΈ μνμ€λ₯Ό μλ³νκ³ μ΄λ₯Ό λλ±νμ§λ§ λ λΉ λ₯Έ μνμ€λ‘ λ³ννλ κ²μ λλ€.
"νΌν"μ΄λΌλ μ©μ΄λ μ΅μ ν νλ‘κ·Έλ¨μ΄ μ½λλ₯Ό λ³Ό λ κ°λ μκ³ κ΅μμ μΈ κ΄μ μ μλ―Έν©λλ€. μ 체 νλ‘κ·Έλ¨μ ꡬ쑰λ₯Ό μ΄ν΄νλ € νμ§ μκ³ , λμ μ§§μ λͺ λ Ήμ΄ μνμ€λ₯Ό μ΅μ ννλ λ° μ€μ μ λ‘λλ€.
Pythonμμ νΌν μ΅μ νκ° μλνλ λ°©μ
Python μ»΄νμΌλ¬(νΉν CPython μ»΄νμΌλ¬)λ μΆμ ꡬ문 νΈλ¦¬(AST)κ° λ°μ΄νΈμ½λλ‘ λ³νλ ν μ½λ μμ± λ¨κ³μμ νΌν μ΅μ νλ₯Ό μνν©λλ€. μ΅μ ν νλ‘κ·Έλ¨μ 미리 μ μλ ν¨ν΄μ μ°Ύμ λ°μ΄νΈμ½λλ₯Ό μνν©λλ€. μΌμΉνλ ν¨ν΄μ΄ λ°κ²¬λλ©΄ λ ν¨μ¨μ μΈ λλ±ν κ²μΌλ‘ λ체λ©λλ€. μ΄ κ³Όμ μ λ μ΄μ μ΅μ νλ₯Ό μ μ©ν μ μμ λκΉμ§ λ°λ³΅λ©λλ€.
CPythonμ΄ μννλ λͺ κ°μ§ μΌλ°μ μΈ νΌν μ΅μ ν μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€:
1. μμ ν΄λ© (Constant Folding)
μμ ν΄λ©μ λ°νμμ΄ μλ μ»΄νμΌ μκ°μ μμ ννμμ νκ°νλ κ²μ ν¬ν¨ν©λλ€. μλ₯Ό λ€μ΄:
def calculate():
return 2 + 3 * 4
dis.dis(calculate)
μμ ν΄λ©μ΄ μμΌλ©΄ λ°μ΄νΈμ½λλ λ€μκ³Ό κ°μ΄ λ³΄μΌ κ²μ λλ€:
1 0 LOAD_CONST 1 (2)
2 LOAD_CONST 2 (3)
4 LOAD_CONST 3 (4)
6 BINARY_OP 4 (*)
8 BINARY_OP 0 (+)
10 RETURN_VALUE
νμ§λ§ μμ ν΄λ©μ μ¬μ©νλ©΄ μ»΄νμΌλ¬κ° κ²°κ³Όλ₯Ό 미리 κ³μ°(2 + 3 * 4 = 14)νκ³ μ 체 ννμμ λ¨μΌ μμλ‘ λ체ν μ μμ΅λλ€:
1 0 LOAD_CONST 1 (14)
2 RETURN_VALUE
μ΄λ λ°νμμ μ€νλλ λͺ λ Ήμ΄ μλ₯Ό ν¬κ² μ€μ¬ μ±λ₯ ν₯μμΌλ‘ μ΄μ΄μ§λλ€.
2. μμ μ ν (Constant Propagation)
μμ μ νλ μμ κ°μ κ°μ§κ³ μλ λ³μλ₯Ό ν΄λΉ μμ κ°μΌλ‘ μ§μ λ체νλ κ²μ ν¬ν¨ν©λλ€. λ€μ μμλ₯Ό κ³ λ €ν΄λ³΄μΈμ:
def greet():
message = "Hello, World!"
print(message)
dis.dis(greet)
μ΅μ ν νλ‘κ·Έλ¨μ μμ λ¬Έμμ΄ "Hello, World!"λ₯Ό print ν¨μ νΈμΆμ μ§μ μ ννμ¬, message λ³μλ₯Ό λ‘λν νμλ₯Ό μ μ¬μ μΌλ‘ μ κ±°ν μ μμ΅λλ€.
3. λ°λ μ½λ μ κ±° (Dead Code Elimination)
λ°λ μ½λ μ κ±°λ νλ‘κ·Έλ¨ μΆλ ₯μ μν₯μ λ―ΈμΉμ§ μλ μ½λλ₯Ό μ κ±°ν©λλ€. μ΄λ μ¬μ©λμ§ μλ λ³μλ νμ κ±°μ§μΈ μ‘°κ±΄λΆ λΆκΈ°μ κ°μ λ€μν μ΄μ λ‘ λ°μν μ μμ΅λλ€. μλ₯Ό λ€μ΄:
def useless():
x = 10
y = 20
if False:
z = x + y
return x
dis.dis(useless)
if False λΈλ‘ μμ z = x + y μ€μ μ λ μ€νλμ§ μμΌλ―λ‘ μ΅μ ν νλ‘κ·Έλ¨μ μν΄ μμ νκ² μ κ±°λ μ μμ΅λλ€.
4. μ ν μ΅μ ν (Jump Optimization)
μ ν μ΅μ νλ μ ν λͺ
λ Ήμ΄(μ: JUMP_FORWARD, JUMP_IF_FALSE_OR_POP)λ₯Ό λ¨μννμ¬ μ ν νμλ₯Ό μ€μ΄κ³ μ μ΄ νλ¦μ κ°μννλ λ° μ€μ μ λ‘λλ€. μλ₯Ό λ€μ΄, ν μ ν λͺ
λ Ήμ΄κ° μ¦μ λ€λ₯Έ μ ν λͺ
λ Ήμ΄λ‘ μ ννλ κ²½μ°, 첫 λ²μ§Έ μ νλ μ΅μ’
λμμΌλ‘ μ¬μ§μ λ μ μμ΅λλ€.
5. 루ν μ΅μ ν (Loop Optimization)
νΌν μ΅μ νλ μ£Όλ‘ μ§§μ λͺ λ Ήμ΄ μνμ€μ μ΄μ μ λ§μΆμ§λ§, 루ν λ΄μμ μ€λ³΅λλ μ°μ°μ μλ³νκ³ μ κ±°ν¨μΌλ‘μ¨ λ£¨ν μ΅μ νμλ κΈ°μ¬ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, 루ν λ³μμ μμ‘΄νμ§ μλ 루ν λ΄μ μμ ννμμ 루ν μΈλΆλ‘ μ΄λλ μ μμ΅λλ€.
λ°μ΄νΈμ½λ νΌν μ΅μ νμ μ΄μ
λ°μ΄νΈμ½λ νΌν μ΅μ νλ λͺ κ°μ§ μ£Όμ μ΄μ μ μ 곡ν©λλ€:
- ν₯μλ μ±λ₯: λ°νμμ μ€νλλ λͺ λ Ήμ΄ μλ₯Ό μ€μμΌλ‘μ¨ νΌν μ΅μ νλ Python μ½λμ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
- μ½λ ν¬κΈ° κ°μ: λ°λ μ½λλ₯Ό μ κ±°νκ³ λͺ λ Ήμ΄ μνμ€λ₯Ό λ¨μννλ©΄ λ°μ΄νΈμ½λ ν¬κΈ°κ° μμμ Έ λ©λͺ¨λ¦¬ μ¬μ©λμ μ€μ΄κ³ λ‘λ μκ°μ κ°μ ν μ μμ΅λλ€.
- λ¨μμ±: νΌν μ΅μ νλ ꡬννκΈ°μ λΉκ΅μ κ°λ¨ν κΈ°μ μ΄λ©° 볡μ‘ν νλ‘κ·Έλ¨ λΆμμ νμλ‘ νμ§ μμ΅λλ€.
- νλ«νΌ λ 립μ±: μ΅μ νλ νλ«νΌ λ 립μ μΈ λ°μ΄νΈμ½λμ λν΄ μνλλ―λ‘, λ€λ₯Έ μμ€ν μμλ μ΄μ μ λ릴 μ μμ΅λλ€.
νΌν μ΅μ νμ νκ³
μ₯μ μλ λΆκ΅¬νκ³ , νΌν μ΅μ νμλ λͺ κ°μ§ νκ³κ° μμ΅λλ€:
- μ νλ λ²μ: νΌν μ΅μ νλ μ§§μ λͺ λ Ήμ΄ μνμ€λ§ κ³ λ €νλ―λ‘, μ½λμ λν λ λμ μ΄ν΄λ₯Ό μꡬνλ 볡μ‘ν μ΅μ νλ₯Ό μννλ λ° νκ³κ° μμ΅λλ€.
- μ°¨μ μ± κ²°κ³Ό: νΌν μ΅μ νκ° μ±λ₯μ ν₯μμν¬ μ μμ§λ§, νμ μ΅μμ κ²°κ³Όλ₯Ό λ¬μ±νμ§λ λͺ»ν μ μμ΅λλ€. μ μ μ΅μ ν λλ ν¨μ κ° λΆμκ³Ό κ°μ λ κ³ κΈ μ΅μ ν κΈ°λ²μ μΆκ°μ μΈ κ°μ μ κ°μ Έμ¬ μ μμ΅λλ€.
- CPython νΉμ : μνλλ νΉμ νΌν μ΅μ νλ Python ꡬν(CPython)μ λ°λΌ λ€λ¦ λλ€. λ€λ₯Έ Python ꡬνμ λ€λ₯Έ μ΅μ ν μ λ΅μ μ¬μ©ν μ μμ΅λλ€.
μ€μ©μ μΈ μμ λ° μν₯
μ¬λ¬ νΌν μ΅μ νμ 볡ν©μ μΈ ν¨κ³Όλ₯Ό 보μ¬μ£ΌκΈ° μν΄ μ’ λ μ κ΅ν μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€. 루ν λ΄μμ κ°λ¨ν κ³μ°μ μννλ ν¨μλ₯Ό κ³ λ €ν΄ λ³΄μΈμ:
def compute(n):
result = 0
for i in range(n):
result += i * 2 + 1
return result
dis.dis(compute)
μ΅μ νκ° μμΌλ©΄ 루νμ λ°μ΄νΈμ½λλ κ° λ°λ³΅λ§λ€ μ¬λ¬ LOAD_FAST, LOAD_CONST, BINARY_OP λͺ
λ Ήμ΄λ₯Ό ν¬ν¨ν μ μμ΅λλ€. κ·Έλ¬λ νΌν μ΅μ νλ₯Ό μ¬μ©νλ©΄, iκ° μμ(λλ μΌλΆ λ§₯λ½μμ μ»΄νμΌ μκ°μ μ½κ² νμλ μ μλ κ°)λ‘ μλ €μ Έ μλ κ²½μ° μμ ν΄λ©μ΄ i * 2 + 1μ 미리 κ³μ°ν μ μμ΅λλ€. λν μ ν μ΅μ νλ 루ν μ μ΄ νλ¦μ κ°μνν μ μμ΅λλ€.
νΌν μ΅μ νμ μ νν μν₯μ μ½λμ λ°λΌ λ¬λΌμ§ μ μμ§λ§, μΌλ°μ μΌλ‘ νΉν κ³μ° μ§μ½μ μΈ μμ μ΄λ λΉλ²ν 루ν λ°λ³΅μ ν¬ν¨νλ μ½λμ μ±λ₯μ λμ λλ κ°μ μ κ°μ Έμ΅λλ€.
νΌν μ΅μ νλ₯Ό νμ©νλ λ°©λ²
Python κ°λ°μλ‘μ νΌν μ΅μ νλ₯Ό μ§μ μ μ΄ν μλ μμ΅λλ€. CPython μ»΄νμΌλ¬λ μ»΄νμΌ κ³Όμ μμ μ΄λ¬ν μ΅μ νλ₯Ό μλμΌλ‘ μ μ©ν©λλ€. κ·Έλ¬λ λͺ κ°μ§ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ μ΅μ νμ λ μ ν©ν μ½λλ₯Ό μμ±ν μ μμ΅λλ€:
- μμ μ¬μ©: μ»΄νμΌλ¬κ° μμ ν΄λ© λ° μ νλ₯Ό μνν μ μλλ‘ κ°λ₯ν ν μμλ₯Ό νμ©νμμμ€.
- λΆνμν κ³μ° νΌνκΈ°: νΉν 루ν λ΄μμ μ€λ³΅ κ³μ°μ μ΅μννμμμ€. κ°λ₯νλ€λ©΄ μμ ννμμ 루ν λ°μΌλ‘ μ΄λμν€μμμ€.
- μ½λλ₯Ό κΉ¨λνκ³ λ¨μνκ² μ μ§: μ»΄νμΌλ¬κ° λΆμνκ³ μ΅μ ννκΈ° μ¬μ΄ λͺ ννκ³ κ°κ²°ν μ½λλ₯Ό μμ±νμμμ€.
- μ½λ νλ‘νμΌλ§: νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©νμ¬ μ±λ₯ λ³λͺ© νμμ μλ³νκ³ κ°μ₯ ν° μν₯μ λ―ΈμΉ μ μλ μμμ μ΅μ ν λ Έλ ₯μ μ§μ€νμμμ€.
νΌν μ΅μ νλ₯Ό λμ΄μ: λ€λ₯Έ μ΅μ ν κΈ°λ²λ€
νΌν μ΅μ νλ Python μ½λ μ΅μ νμ νΌμ¦ μ‘°κ° μ€ νλμΌ λΏμ λλ€. λ€λ₯Έ μ΅μ ν κΈ°λ²μ λ€μκ³Ό κ°μ΅λλ€:
- Just-In-Time (JIT) μ»΄νμΌ: PyPyμ κ°μ JIT μ»΄νμΌλ¬λ λ°νμμ Python μ½λλ₯Ό λ€μ΄ν°λΈ κΈ°κ³ μ½λλ‘ λμ μΌλ‘ μ»΄νμΌνμ¬ μλΉν μ±λ₯ ν₯μμ κ°μ Έμ΅λλ€.
- Cython: Cythonμ Pythonκ³Ό μ μ¬ν μ½λλ₯Ό Cλ‘ μ»΄νμΌν μ μκ² νμ¬ Pythonκ³Ό Cμ μ±λ₯ μ¬μ΄μ λ€λ¦¬ μν μ ν©λλ€.
- 벑ν°ν: NumPyμ κ°μ λΌμ΄λΈλ¬λ¦¬λ 벑ν°νλ μ°μ°μ κ°λ₯νκ² νμ¬, μ 체 λ°°μ΄μ λν΄ ν λ²μ μ°μ°μ μνν¨μΌλ‘μ¨ μμΉ κ³μ° μλλ₯Ό ν¬κ² λμΌ μ μμ΅λλ€.
- λΉλκΈ° νλ‘κ·Έλλ°:
asyncioλ₯Ό μ¬μ©ν λΉλκΈ° νλ‘κ·Έλλ°μ λ©μΈ μ€λ λλ₯Ό μ°¨λ¨νμ§ μκ³ μ¬λ¬ μμ μ λμμ μ²λ¦¬ν μ μλ λμμ± μ½λλ₯Ό μμ±ν μ μκ² ν©λλ€.
κ²°λ‘
λ°μ΄νΈμ½λ νΌν μ΅μ νλ Python μ»΄νμΌλ¬κ° Python μ½λμ μ±λ₯μ ν₯μμν€κ³ ν¬κΈ°λ₯Ό μ€μ΄κΈ° μν΄ μ¬μ©νλ μ μ©ν κΈ°μ μ λλ€. μ§§μ λ°μ΄νΈμ½λ λͺ λ Ήμ΄ μνμ€λ₯Ό κ²μ¬νκ³ μ΄λ₯Ό λ ν¨μ¨μ μΈ λμμΌλ‘ λ체ν¨μΌλ‘μ¨, νΌν μ΅μ νλ Python μ½λλ₯Ό λ λΉ λ₯΄κ³ κ°κ²°νκ² λ§λλ λ° κΈ°μ¬ν©λλ€. λΉλ‘ νκ³κ° μμ§λ§, μ 체 Python μ΅μ ν μ λ΅μ μ€μν λΆλΆμΌλ‘ λ¨μ μμ΅λλ€.
νΌν μ΅μ ν λ° λ€λ₯Έ μ΅μ ν κΈ°λ²μ μ΄ν΄νλ©΄ λ ν¨μ¨μ μΈ Python μ½λλ₯Ό μμ±νκ³ κ³ μ±λ₯ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° λμμ΄ λ μ μμ΅λλ€. λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄κ³ μ¬μ© κ°λ₯ν λꡬμ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©ν¨μΌλ‘μ¨ Pythonμ μ μ¬λ ₯μ μ΅λν λ°ννκ³ μ±λ₯κ³Ό μ μ§λ³΄μμ±μ΄ λ°μ΄λ μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€.
μΆκ° μλ£
- Python dis λͺ¨λ λ¬Έμ: https://docs.python.org/3/library/dis.html
- CPython μμ€ μ½λ (νΉν νΌν μ΅μ ν): μ΅μ ν κ³Όμ μ λν λ κΉμ μ΄ν΄λ₯Ό μν΄ CPython μμ€ μ½λλ₯Ό νμνμμμ€.
- μ»΄νμΌλ¬ μ΅μ νμ λν μμ λ° κΈ°μ¬: μ΄ λΆμΌμ λν ν¬κ΄μ μΈ μ΄ν΄λ₯Ό μν΄ μ»΄νμΌλ¬ μ€κ³ λ° μ΅μ ν κΈ°λ²μ λν μλ£λ₯Ό μ°Έκ³ νμμμ€.