반응형
질문
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_FAST
가 STORE_NAME
보다 빠르다는 것입니다. 이는 함수 내에서 i
가 로컬이지만 최상위 수준에서는 글로벌이기 때문입니다.
바이트코드를 검사하려면 dis
모듈을 사용하세요. 함수를 직접 분해할 수 있었지만 최상위 코드를 분해하려면 compile
내장 함수를 사용해야 했습니다.
반응형
댓글