0

timeit 関数を使用して、作成した 2 つのメソッドでいくつかのメトリックを実行していますが、問題が発生しています。以下の単純化されたサンプル ファイルを参照してください。

fileA.py、これはスタンドアロンで実行され、関数 foo を timeit でテストしようとしています。

if (len(sys.argv) < 2):
    print "Need a command line argument, exiting"
    sys.exit(1)

def foo(n):
    #does some stuff, returns an int

この関数はスタンドアロンで正常に動作し、次のように実行できます./fileA.py 5

私は同様のファイルを持っています。fileB.pyこれは foo の異なる実装ですが、foo の内部を除いてまったく同じです。

ここで、fileA と fileB の両方で timeit を使用しようとしています (fileB の部分は省略されています)。

for n in range(0,10):
    setupStr = 'from fileA import foo'
    setupStr += '; from __main__ import n'
    mytime = timeit.Timer('foo(n)', setupStr)
    timeTaken = mytime.timeit(1)
    print #results, not important

私が得ている問題は、fileC.pyを実行すると、「コマンドライン引数が必要です、終了します」と表示されて終了することです。これが fileA.py から来ていることは理解していますが、コードのこの部分が実行されているのはなぜですか? 私は、timeit の動作方法として、fileA から foo をインポートしているだけだという印象を受けました。私は間違っていると思いますか?もしそうなら、これを修正する最善の方法は何でしょうか?メソッドfoo(n)をテストし、必要なコマンド ライン引数を使用して fileA をスタンドアロンで実行できるようにするにはどうすればよいでしょうか?

4

1 に答える 1

2

fileAPython はモジュール全体を評価して解決する必要があります。正しい値を取得するために評価する必要があるコードによって作成された関数ではなく、モジュール レベルの変数名を使用from fileA import fooすることは完全に正当です。これを回避するには、 がスタンドアロンで呼び出されfooたときにのみ実行されるはずのコードを次のようにラップします。fileA

if __name__ == '__main__':
    if (len(sys.argv) < 2):
        ...

より詳細な説明については、この質問に対する受け入れられた回答を参照してください: What does if __name__ == "__main__": do?

于 2014-01-26T23:43:32.413 に答える