Python - 类中的Timeit

Diz*_*Doo 4 python self 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()
Run Code Online (Sandbox Code Playgroud)

哪,跑步时,抱怨自我.

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
Run Code Online (Sandbox Code Playgroud)

这与TimeIt创建一个虚拟环境以运行该函数有关,但是我需要传递给第二个参数以使其全部满意?

dei*_*eif 10

如果您愿意考虑替代方案timeit,我最近发现了秒表计时器实用程序,它可能对您的情况有用.它也非常简单直观:

import stopwatch

class TimedClass():

    def __init__(self):
        t = stopwatch.Timer()
        # do stuff here
        t.stop()
        print t.elapsed
Run Code Online (Sandbox Code Playgroud)

  • 比计算'timeit`简单得多.Python对`timeit`的所有属性进行了很好的细分,但是如何使用它来分析代码的解释和示例令人困惑. (6认同)

Ivo*_*ijk 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()
Run Code Online (Sandbox Code Playgroud)

(当然这个类本身是多余的,我假设你有一个更复杂的用例,其中一个简单的方法是不够的).

通常,只需传递包含/配置了所有设置的可调用对象.如果你想传递字符串来定时,它们应该包含所有必要的设置,即

timeit.Timer("[str(x) for x in range(100)]").timeit()
Run Code Online (Sandbox Code Playgroud)

如果你确实需要类中的时间,请用本地方法包装调用,即

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

    timeit.Timer(timewrapper)
Run Code Online (Sandbox Code Playgroud)


Min*_*dge 5

要解决您的初始错误,您可以在具有以下参数的类中使用timeit:

 t = timeit.Timer(lambda: self.square(self.x, self.y)).timeit()
Run Code Online (Sandbox Code Playgroud)