Python 코드최적화 1. Peephole optimization
파이썬은 인터프리터 언어이지만 컴파일을 거친다.
개발자가 실행한 코드는 한 줄 한 줄 런타임에 컴파일 되고 해석된다.
미리 컴파일 되지 않으면 매 번 소스코드 한 줄을 해석할 때마다 같은 연산을 반복해야할 수 있고,
만약 어떤 연산을 하는 코드가 반복적으로 있다면 해당 코드를 실행할 때마다 연산을 다시해야하기 때문에 느려지게 될 것이다.
따라서 파이썬은 컴파일 할 때 특정 조건에 만족하는 항목들은 미리 계산(pre-calculate) 해두고 이를 상수로 갖고 있는다.
조건은 크게 얘기하면 Immutable한 객체의 연산 이라고 할 수 있고 조금 더 디테일 하게 들어가면 아래와 같다.
1) Numeric Calculation (숫자 계산)
Ex) 24 * 60, 300 * 12, 30000* 12000
2) 연산결과의 length가 20이 넘지 않는 Immutable 객체의 Sequence 연산
Yes) "Hello" + "World"
"abc" * 5
(1,2) * 5
No) "ab"*11 (이건 22글자가 되기 때문에 탈락)
(1,2) * 11 (마찬가지로 22개가 되기 때문에 탈락)
P.S) Sequence가 중요하지 않은 객체 내 Member검사를 할 때는 Set을 쓰는게 좋다.
if a in [1,2,3] 보다는 if a in {1,2,3} 이 속도가 10배는 더 빠르다.
개발자가 실행한 코드는 한 줄 한 줄 런타임에 컴파일 되고 해석된다.
미리 컴파일 되지 않으면 매 번 소스코드 한 줄을 해석할 때마다 같은 연산을 반복해야할 수 있고,
만약 어떤 연산을 하는 코드가 반복적으로 있다면 해당 코드를 실행할 때마다 연산을 다시해야하기 때문에 느려지게 될 것이다.
따라서 파이썬은 컴파일 할 때 특정 조건에 만족하는 항목들은 미리 계산(pre-calculate) 해두고 이를 상수로 갖고 있는다.
조건은 크게 얘기하면 Immutable한 객체의 연산 이라고 할 수 있고 조금 더 디테일 하게 들어가면 아래와 같다.
1) Numeric Calculation (숫자 계산)
Ex) 24 * 60, 300 * 12, 30000* 12000
2) 연산결과의 length가 20이 넘지 않는 Immutable 객체의 Sequence 연산
Yes) "Hello" + "World"
"abc" * 5
(1,2) * 5
No) "ab"*11 (이건 22글자가 되기 때문에 탈락)
(1,2) * 11 (마찬가지로 22개가 되기 때문에 탈락)
def my_func(): a = 3000000 * 12000 / 27 b = (1,2) * 5 c = "abc" d = "ab" * 11 e = "the quick brown fox" * 5 f = ["a","b"] * 3 g = ["a","a","a","a","a","a","a","a","a","a","a","a","a"] print(my_func.__code__.co_consts) # 해당 펑션의 상수를 나타낸다.
>> result : (None, 24, 60, 1, 2, 5, 'abc', 'ab', 11, 'the quick brown fox', 'a', 'b', 3, 1440, (1, 2), (1, 2, 1, 2, 1, 2, 1, 2, 1, 2))
P.S) Sequence가 중요하지 않은 객체 내 Member검사를 할 때는 Set을 쓰는게 좋다.
if a in [1,2,3] 보다는 if a in {1,2,3} 이 속도가 10배는 더 빠르다.
댓글
댓글 쓰기