2012-01-04 8 views
6

コード最適化のための時間関数に問題があります。Python Timeitと "global name ...が定義されていません"

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が計算され、私はエラーが発生したglobal name 'myfunctions' is not definedprint Y0行をコメントしてもされていません。

私は今、エラーglobal name 'X0' is not definedが発生したコマンドで

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

をセットアップを指定した場合。

誰かがこれを解決する方法を知っていますか?どうもありがとう。

+0

[グローバル名 '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

質問で言及したように、これはエラー "グローバル名 'X0'は定義されていません" – cedm34

+0

@ cedm34更新を参照してください –

+1

グローバルエラーはうまくdisapearedています。しかし、これは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で使用するメインファイル内の任意の関数がある場合は、あなたが2番目の引数としてfrom __main__ import *を渡すことでtimeitがそれらを認識させることができるということです。あなたは、変数を変更できるように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を入れて!

関連する問題