我在从一个类的实例中计时函数时遇到了一些麻烦。我不确定我是不是以正确的方式(从未使用过时间),我尝试了第二个参数导入内容的一些变体,但没有运气。这是我正在做的一个愚蠢的例子:
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创建一个小虚拟环境来运行该函数有关,但是我需要传递给第二个参数才能让它快乐?
答案 0 :(得分:10)
如果您愿意考虑timeit
的替代方案,我最近找到了stopwatch计时器实用程序,它可能对您的情况有用。它也非常简单直观:
import stopwatch
class TimedClass():
def __init__(self):
t = stopwatch.Timer()
# do stuff here
t.stop()
print t.elapsed
答案 1 :(得分: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)
答案 2 :(得分:4)
要解决初始错误,可以在类中使用带有以下参数的timeit:
t = timeit.Timer(lambda: self.square(self.x, self.y)).timeit()
答案 3 :(得分: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