2017-05-15 1 views
3

timeit 모듈은 작은 코드 스 니펫의 실행 시간을 측정하는 데 적합하지만 코드가 글로벌 상태 (예 : timeit)를 변경하면 정확한 타이밍을 얻는 것이 정말 어렵습니다.파이썬에서 정확한 타이밍을 가져 오기

예를 들어 모듈을 가져 오는 데 시간이 걸리면 하위 모듈과 종속성이 이미 가져 왔고 파일이 이미 캐시되어 있기 때문에 첫 번째 가져 오기에 후속 가져 오기보다 훨씬 오래 걸립니다. 그래서처럼, 반복 number 더 큰를 사용하여 :

>>> import timeit 
>>> timeit.timeit('import numpy', number=1) 
0.2819331711316805 

>>> # Start a new Python session: 
>>> timeit.timeit('import numpy', number=1000) 
0.3035142574359181 

정말 작동하지 않습니다, 하나의 실행을위한 시간 1000 원에 거의 동일하기 때문이다. 나는 패키지 "다시로드"에 명령을 실행할 수 있습니다 :

>>> timeit.timeit('imp.reload(numpy)', 'import importlib as imp; import numpy', number=1000) 
3.6543283935557156 

를하지만 처음 import에 비해 10 배 느린 있다고는 하나 정확하지의 제안 보인다.

모듈을 완전히 내릴 수없는 것처럼 보입니다 ("Unload a module in Python").

그래서 질문은 : import 시간을 정확하게 측정하는 적절한 방법은 무엇입니까? 완전히 모듈을 언로드하는 것은 거의 불가능하기 때문에

+1

좋은 질문입니다. 그냥 생각이 나쁘다. 아마도 빈 스크립트에 대해 인터프리터를 100 번 실행 한 다음 인터프리터를'import numpy'와 substract로 100 번 실행하면된다. –

+3

필자는 왜 이것을하고 싶은지 물어볼 가치가 있다고 생각합니다. 이것은 프로그램 실행 당 한 번만 지불하게되는 가격이기 때문에 가져 오기를 한 번 또는 두 번 완료하면 의미를 얻는 데 충분할 것입니다. 얼마나 느린 지 느껴지십니까 ... 어려운 숫자는 아마도 여기에 그다지 의미하지 않습니다. 왜냐하면 통계가 어쨌든 실제로 의미가있는만큼 느린 경로에 도달하지 않기 때문입니다. – mgilson

+0

@ Jean-FrançoisFabre 'python -m timeit '을 호출하는 스크립트는 명령 행에서 numpy'-r 1'을 임포트합니까? – MSeifert

답변

2

, 어쩌면이 대답 뒤에 영감 ... this입니다

당신은 X 시간 numpy 다른 하나를 가져 파이썬 명령을 실행 파이썬 스크립트에서 루프를 실행할 수

아무것도하지 않고 양쪽 평균을 모두 뺍니다 :

import subprocess,time 

n=100 
python_load_time = 0 
numpy_load_time = 0 

for i in range(n): 
    s = time.time() 
    subprocess.call(["python","-c","import numpy"]) 
    numpy_load_time += time.time()-s 

    s = time.time() 
    subprocess.call(["python","-c","pass"]) 
    python_load_time += time.time()-s 

print("average numpy load time = {}".format((numpy_load_time-python_load_time)/n))