7

我在从一个类的实例中计时一个函数时遇到了一些真正的麻烦。我不确定我是否以正确的方式进行操作(以前从未使用过 timeIt),并且我尝试了第二个参数的一些变体来导入东西,但没有运气。这是我正在做的一个愚蠢的例子:

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 创建了一个小虚拟环境来运行该函数有关,但是我必须将什么传递给第二个参数才能让它变得快乐?

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

为什么你希望类内的时间被自己计时?如果你把时间带出课堂,你可以通过参考。IE

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 回答