99

Python ステートメントの実行にかかる時間を調べようとしているので、オンラインで調べたところ、標準ライブラリが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 を使い始めたばかりで、スコープの問題をすべて完全に理解していませんが、なぜこのスニペットが機能しないのかわかりません。何かご意見は?

4

5 に答える 5

96

この行を変更します。

t = timeit.Timer("foo()")

これに:

t = timeit.Timer("foo()", "from __main__ import foo")

一番下にあるリンクを確認してください。

timeit モジュールに、定義した関数へのアクセスを許可するには、インポート ステートメントを含むセットアップ パラメーターを渡します。

自分のマシンでテストしたところ、変更に対応していました。

于 2009-02-15T23:18:42.247 に答える
21

このハックを試すことができます:

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()
于 2011-03-22T11:16:51.940 に答える
8
t = timeit.Timer("foo()", "from __main__ import foo")

それ以来、あなたのものは範囲内にありません。

于 2009-02-15T23:22:16.793 に答える