类中的Python-Timeit

2024-05-12 00:39:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我在从类的实例中为函数计时时遇到了一些实际问题。我不确定我的方法是否正确(以前从未使用过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创建了一个小的虚拟环境来运行函数有关,但是我必须将什么传递给第二个参数才能使它一切正常呢?


Tags: 实例函数inpyself参数initdef
3条回答

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

import stopwatch

class TimedClass():

    def __init__(self):
        t = stopwatch.Timer()
        # do stuff here
        t.stop()
        print t.elapsed

你为什么要在类内的计时本身计时?如果你不在课堂上计时,你只需传递一个参考。一、 e

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()

(当然类本身是多余的,我假设您有一个complexer用例,其中一个简单的方法是不够的)。

一般来说,只要传递一个包含/配置了所有设置的可调用文件。如果要传递要计时的字符串,它们应该包含所有必要的设置,即

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)

要解决初始错误,可以在类中使用timeit,其参数如下:

 t = timeit.Timer(lambda: self.square(self.x, self.y)).timeit()

相关问题 更多 >