본문 바로가기
Python/Python FAQ

Python 파이썬 코드가 함수에서 더 빠르게 실행되는 이유는 무엇인가요?, Why does Python code run faster in a function?

by 베타코드 2023. 6. 10.
반응형

질문


def main():
    for i in xrange(10**8):
        pass
main()

이 파이썬 코드는 다음과 같습니다. (참고: 시간 측정은 리눅스의 BASH에서 time 함수를 사용합니다.)

real    0m1.841s
user    0m1.828s
sys     0m0.012s

그러나 for 루프가 함수 내에 없으면,

for i in xrange(10**8):
    pass

그러면 훨씬 더 오랜 시간 동안 실행됩니다:

real    0m4.543s
user    0m4.524s
sys     0m0.012s

이유는 무엇인가요?


답변


함수 내부에서 바이트코드는 다음과 같습니다:

  2           0 SETUP_LOOP              20 (to 23)
              3 LOAD_GLOBAL              0 (xrange)
              6 LOAD_CONST               3 (100000000)
              9 CALL_FUNCTION            1
             12 GET_ITER            
        >>   13 FOR_ITER                 6 (to 22)
             16 STORE_FAST               0 (i)

  3          19 JUMP_ABSOLUTE           13
        >>   22 POP_BLOCK           
        >>   23 LOAD_CONST               0 (None)
             26 RETURN_VALUE        

최상위 수준에서 바이트코드는 다음과 같습니다:

  1           0 SETUP_LOOP              20 (to 23)
              3 LOAD_NAME                0 (xrange)
              6 LOAD_CONST               3 (100000000)
              9 CALL_FUNCTION            1
             12 GET_ITER            
        >>   13 FOR_ITER                 6 (to 22)
             16 STORE_NAME               1 (i)

  2          19 JUMP_ABSOLUTE           13
        >>   22 POP_BLOCK           
        >>   23 LOAD_CONST               2 (None)
             26 RETURN_VALUE        

차이점은 STORE_FASTSTORE_NAME보다 빠르다는 것입니다. 이는 함수 내에서 i가 로컬이지만 최상위 수준에서는 글로벌이기 때문입니다.

바이트코드를 검사하려면 dis 모듈을 사용하세요. 함수를 직접 분해할 수 있었지만 최상위 코드를 분해하려면 compile 내장 함수를 사용해야 했습니다.

반응형

댓글