파이썬 문을 실행하는 데 걸리는 시간을 알아 내려고했는데, 온라인을 살펴본 결과 표준 라이브러리 가 정확히이를 수행한다고 주장하는 timeit 이라는 모듈을 제공 한다는 것을 알았습니다 .
import timeit
def foo():
# ... contains code I want to time ...
def dotime():
t = timeit.Timer("foo()")
time = t.timeit(1)
print "took %fs\n" % (time,)
dotime()
그러나 다음과 같은 오류가 발생합니다.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in dotime
File "/usr/local/lib/python2.6/timeit.py", line 193, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
NameError: global name 'foo' is not defined
저는 여전히 Python을 처음 접하고 있으며 모든 범위 지정 문제를 완전히 이해하지 못하지만이 코드 조각이 작동하지 않는 이유를 모르겠습니다. 이견있는 사람?
답변
이 줄을 변경하십시오.
t = timeit.Timer("foo()")
이에:
t = timeit.Timer("foo()", "from __main__ import foo")
맨 아래에 제공 한 링크를 확인하십시오.
timeit 모듈에 정의한 함수에 대한 액세스 권한을 부여하려면 import 문이 포함 된 설정 매개 변수를 전달할 수 있습니다.
방금 내 컴퓨터에서 테스트했으며 변경 사항과 함께 작동했습니다.
답변
Python 3에서는 다음을 사용할 수 있습니다. globals=globals()
t = timeit.Timer("foo()", globals=globals())
로부터 문서 :
또 다른 옵션은 전달하는 것입니다
globals()
받는globals
코드가 현재 글로벌 네임 스페이스 내에서 실행되게합니다 매개 변수. 개별적으로 가져 오기를 지정하는 것보다 더 편리 할 수 있습니다.
답변
이 해킹을 시도 할 수 있습니다.
import timeit
def foo():
print 'bar'
def dotime():
t = timeit.Timer("foo()")
time = t.timeit(1)
print "took %fs\n" % (time,)
import __builtin__
__builtin__.__dict__.update(locals())
dotime()
답변
t = timeit.Timer("foo()", "from __main__ import foo")
시간 이후로 그것은 범위에 당신의 물건을 가지고 있지 않습니다.
답변
설정에 추가 “이 파일 가져 오기;”
그런 다음 설정 함수 myfunc ()를 호출 할 때 “thisfile.myfunc ()”를 사용하십시오.
예 : “thisfile.py”
def myfunc():
return 5
def testable(par):
pass
t=timeit.timeit(stmt="testable(v)",setup="import thisfile; v=thisfile.myfunc();").repeat(10)
print( t )