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개가 되기 때문에 탈락)


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배는 더 빠르다.




댓글

이 블로그의 인기 게시물

로컬 Tomcat 서버 실행속도 개선

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

2020.02.17 Python의 multiprocessing 중 Pool.map(), chunksize에 관한 내용