7

クラスのインスタンス内から関数のタイミングをとるのに本当に問題があります。私はそれを正しい方法で行っているかどうかはわかりません(以前はtimeItを使用したことがありません)。2番目の引数のいくつかのバリエーションをインポートして試しましたが、運がありませんでした。これが私がしていることのばかげた例です:

import timeit

class TimedClass():
    def __init__(self):
        self.x = 13
        self.y = 15
        t = timeit.Timer("self.square(self.x, self.y)")
        try:
            t.timeit()
        except:
            t.print_exc()

    def square(self, _x, _y):
        print _x**_y

myTimedClass = TimedClass()

走ったとき、それは自己について不平を言います。

Traceback (most recent call last):
  File "timeItTest.py", line 9, in __init__
    t.timeit()
  File "C:\Python26\lib\timeit.py", line 193, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
    self.square(self.x, self.y)
NameError: global name 'self' is not defined

これは、TimeItが関数を実行するための小さな仮想環境を作成することと関係がありますが、すべてを幸せにするために2番目の引数に何を渡す必要がありますか?

4

4 に答える 4

10

あなたがの代替案を検討したいのであればtimeit、私は最近、あなたの場合に役立つかもしれないストップウォッチタイマーユーティリティを見つけました。それも本当にシンプルで直感的です:

import stopwatch

class TimedClass():

    def __init__(self):
        t = stopwatch.Timer()
        # do stuff here
        t.stop()
        print t.elapsed
于 2010-08-31T13:39:50.863 に答える
9

クラス内のタイミングを自分で計測したいのはなぜですか?クラスからタイミングを外すと、参照を渡すことができます。つまり

import timeit

class TimedClass():
    def __init__(self):
        self.x = 13
        self.y = 15

    def square(self, _x, _y):
        print _x**_y

myTimedClass = TimedClass()
timeit.Timer(myTImedClass.square).timeit()

(もちろん、クラス自体は冗長です。単純なメソッドでは不十分な、より複雑なユースケースがあると思います)。

一般に、すべてのセットアップが含まれている/構成されている呼び出し可能オブジェクトを渡すだけです。タイミングを合わせるために文字列を渡したい場合は、文字列内に必要なすべての設定が含まれている必要があります。

timeit.Timer("[str(x) for x in range(100)]").timeit()

クラス内で本当にタイミングが必要な場合は、呼び出しをローカルメソッドでラップします。

def __init__(self, ..):
    def timewrapper():
        return self.multiply(self.x, self.y)

    timeit.Timer(timewrapper)
于 2010-08-31T13:46:56.603 に答える
6

初期エラーに対処するために、次のようなパラメーターを持つクラス内でtimeitを使用できます。

 t = timeit.Timer(lambda: self.square(self.x, self.y)).timeit()
于 2016-03-30T10:51:37.450 に答える
0

(コードマークアップはコメントでは機能しないため、回答として投稿します)

安全性を高めるために、try/finallyクロージャーを追加します。

class TimedClass():
  def __init__(self):
    t = stopwatch.Timer()
    try:
      # do stuff here, you can even use return "foo" here and throw exceptions
    finally:
      t.stop()
      print t.elapsed
于 2014-11-13T08:13:41.630 に答える