2012-01-04 9 views
6

코드 최적화를위한 timit 함수에 문제가 있습니다.Python Timeit과 "global name ... is not defined"

def func1(X): 
    Y = X+1 
    return Y 

와 나는 분명히 더 복잡한에 (코드 성능을 테스트하기 위해 타이머 함수를 호출 두 번째 파일 test.py에서이 함수를 테스트 : 예를 들어, 내가 파일에 매개 변수로 함수를 작성,의는 포함 myfunctions.py를 호출하자 문제)를 포함!

import myfunctions 
X0 = 1 
t = Timer("Y0 = myfunctions.func1(X0)") 
print Y0 
print t.timeit() 

Y0 계산, 나는 print Y0 라인을 코멘트 경우에도 오류 global name 'myfunctions' is not defined가 발생하지 않습니다.

내가

t = Timer("Y0 = myfunctions.func1(X0)","import myfunctions") 

이제 오류 global name 'X0' is not defined가 발생한 명령을 사용하여 설정을 지정합니다.

누군가이 문제를 해결하는 방법을 알고 있습니까? 많은 감사합니다.

+0

[global name 'foo'가 Python의 timeit으로 정의되지 않았습니다.] 가능한 복제본 (https://stackoverflow.com/questions/551797/getting-global-name-foo-is-not-defined-with) -pythons-timeit) – sds

답변

6

setup 매개 변수가 필요합니다. 시도 : Y0 이유가 정의되어 있지 않다고

Timer("Y0 = myfunctions.func1(X0)", setup="import myfunctions; X0 = 1") 
+0

내가 질문에서 언급했듯이, "global name 'X0'이 정의되지 않았습니다." – cedm34

+0

@ cedm34 업데이트보기 –

+1

전역 오류가 잘 처리되지 않았습니다.그러나 이것은 Y0 값을 생성하지 않습니다. 거기에 대한 해결책이 있습니까? – cedm34

4

당신이 문자열에 있지만, 실행의 시작 부분에서 구문 분석시에 문자열이 아직 평가되지 않습니다 생활에 변수를 가지고 있음을 정의한 것입니다. 따라서 미리 스크립트의 상단에 Y0 = 0을 넣어 미리 정의하십시오.

외부 함수 및 변수는 모두 setup 인수를 사용하여 Timer에 제공해야합니다. 따라서 설정 매개 변수로 "import myfunctions; X0 = 1"이 필요합니다.

이 작동합니다 : 나는 "X0 = %i" % (X0,)을 사용하는 방법

from timeit import Timer 
import myfunctions 
X0 = 1 
Y0 = 0  #Have Y0 defined 
t = Timer("Y0 = myfunctions.func1(X0)", "import myfunctions; X0 = %i" % (X0,)) 
print t.timeit() 
print Y0 

봐 외부 X0 변수의 진정한 가치를 전달 할 수 있습니다.

당신이 알고 할 수 있습니다 또 다른 한가지는 당신이 timeit에 사용할 주요 파일의 모든 기능이있는 경우, 당신은 timeit이 두 번째 인수로 from __main__ import *을 전달하여이를 인식 할 수 있다는 것입니다. 당신이 당신의 변수를 수정할 수 있도록 timeit를 원하는 경우에


, 당신은 그들에게 문자열을 통과하지 않아야합니다. 보다 편리하게 호출 가능 객체를 전달할 수 있습니다. 원하는 변수를 변경하는 호출 가능 함수를 전달해야합니다. 다음 setup 필요하지 않습니다. 봐 : 보시다시피

from timeit import Timer 
import myfunctions 

def measure_me(): 
    global Y0 #Make measure_me able to modify Y0 
    Y0 = myfunctions.func1(X0) 

X0 = 1 
Y0 = 0  #Have Y0 defined 
t = Timer(measure_me) 
print t.timeit() 
print Y0 

, 난 당신이 그 값이 변경되지 수 있습니다 전에 실행 이후print t.timeit()print Y0을 넣어!

관련 문제