728x90
반응형
질문 : Python 코드가 함수에서 더 빠르게 실행되는 이유는 무엇입니까?
def main():
for i in xrange(10**8):
pass
main()
Python의이 코드는 다음에서 실행됩니다 (참고 : 타이밍은 Linux의 BASH에서 시간 함수로 수행됩니다.)
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
왜 이런거야?
답변
전역 변수보다 지역 변수를 저장하는 것이 더 빠른 이유를 물을 수 있습니다. 이것은 CPython 구현 세부 사항입니다.
CPython은 인터프리터가 실행하는 바이트 코드로 컴파일됩니다. 함수를 컴파일 할 때, 로컬 변수는 고정 크기 어레이 (하지에 저장된 dict
) 및 변수 이름은 인덱스에 할당된다. 함수에 지역 변수를 동적으로 추가 할 수 없기 때문에 가능합니다. 그런 다음 지역 변수를 검색하는 것은 말 그대로 목록에 대한 포인터 조회와 사소한 PyObject
이것을 해시 등을 포함하는 dict
검색 인 글로벌 조회 ( LOAD_GLOBAL
)와 대조하십시오. global i
를 지정해야하는 이유입니다 : 범위 내의 변수에 할당 한 적이 있다면 컴파일러는 당신이 지정하지 않는 한 액세스를 위해 STORE_FAST
그건 그렇고, 글로벌 조회는 여전히 꽤 최적화되어 있습니다. 속성 조회 foo.bar
는 정말 느린 것입니다!
다음은 지역 변수 효율성에 대한 작은 그림입니다.
출처 : https://stackoverflow.com/questions/11241523/why-does-python-code-run-faster-in-a-function
728x90
반응형
'프로그래밍 언어 > Python' 카테고리의 다른 글
SQLAlchemy : flush ()와 commit ()의 차이점 (0) | 2021.09.07 |
---|---|
Python에서 파일 객체의 크기를 바이트 단위로 가져 오는 내장 함수 (0) | 2021.09.02 |
파이썬 디렉토리의 모든 파일을 나열하는 방법 (0) | 2021.09.01 |
requirements.txt에 직접 github 소스를 명시하는 방법 (0) | 2021.09.01 |
Python setup.py가 Travis CI에서 잘못된 명령 'bdist_wheel'을 말하는 이유 (0) | 2021.09.01 |