함수에서 Python 코드가 더 빠르게 실행되는 이유는 무엇입니까?
루프를 1억 번 실행하는 아래 Python 코드 조각을 살펴보세요.
def main(): for i in range(10**8): pass main()
Linux에서 time 함수를 사용하여 측정했을 때 이 코드는 놀라울 정도로 실행됩니다. 신속하게:
real 0m1.841s user 0m1.828s sys 0m0.012s
신기하게도 for 루프가 함수 내에 포함되지 않고 실행되면:
for i in range(10**8): pass
실행 시간이 상당히 늘어납니다:
real 0m4.543s user 0m4.524s sys 0m0.012s
왜 이러한 불일치가 발생합니까?
Inside 함수
바이트코드를 조사하면 코드가 함수 내에 있을 때 다음이 드러납니다.
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의 사용 차이가 있습니다. STORE_FAST는 변수(이 경우 i)가 지역 변수(함수 내)인 경우에 사용되는 반면, STORE_NAME은 변수가 전역 변수(함수 외부)인 경우에 사용됩니다. 전자가 훨씬 더 효율적입니다.
이는 변수가 로컬로 선언되면 인터프리터가 해당 변수에 대한 특정 메모리 위치를 사용하도록 코드를 최적화할 수 있다는 사실로 설명할 수 있습니다. 그러나 변수가 전역으로 선언되면 인터프리터는 변수를 찾기 위해 전역 범위 전체를 검색해야 하므로 시간이 더 많이 소요됩니다.
위 내용은 Python 코드가 함수 내에서 실행될 때 더 빠른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!