7

コード最適化のための timit 関数に問題があります。たとえば、ファイルにパラメーターを持つ関数を書いている場合、次をmyfunctions.py含むと呼びましょう:

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

そして、この関数を 2 番目のファイルtest.pyでテストします。このファイルでは、timer 関数を呼び出してコードのパフォーマンスをテストします (明らかにより複雑な問題で!)。

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が発生しました。

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

4

2 に答える 2

6

setupパラメータが必要です。試す:

Timer("Y0 = myfunctions.func1(X0)", setup="import myfunctions; X0 = 1")
于 2012-01-04T12:49:41.717 に答える
4

未定義の理由Y0は、文字列でそれを定義したためですが、実行の開始時の解析時に文字列はまだ評価されていないため、変数が有効になります。したがってY0 = 0、スクリプトの先頭にどこかに配置して、事前に定義してください。

すべての外部関数と変数はTimer、そのsetup引数を使用して指定する必要があります。"import myfunctions; X0 = 1"したがって、セットアップパラメーターとして必要です。

これはうまくいきます:

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 = %i" % (X0,)外部 X0 変数の実際の値を渡す方法を見てください。

もう 1 つ知っておくべきことは、メイン ファイルに で使用したい関数がある場合、2 番目の引数として渡すことでそれらを認識さtimeitせることができるということです。timeitfrom __main__ import *


timeit変数を変更できるようにしたい場合は、変数に文字列を渡すべきではありません。より便利に、呼び出し可能オブジェクトを渡すことができます。目的の変数を変更する callable を渡す必要があります。その時は必要ありません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 Y0 after を置きました。print t.timeit()

于 2012-01-04T16:37:30.630 に答える