[python] Python의 timeit으로 “글로벌 이름 ‘foo’가 정의되지 않았습니다.”가져 오기

파이썬 문을 실행하는 데 걸리는 시간을 알아 내려고했는데, 온라인을 살펴본 결과 표준 라이브러리 가 정확히이를 수행한다고 주장하는 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 )


답변