如何将当前对象引用(self)传递给timeit模块的Timer类?

1 投票
2 回答
3814 浏览
提问于 2025-04-16 04:04

我想把当前对象的引用,也就是self,传递给timeit模块的Timer类,但我不知道该怎么做。我在timeit的文档里找过,但没找到相关信息。我把我的代码附在了这个问题下面。

from timeit import Timer
import time  
import math

class PollingDemo(Thread):

    def __init__(self):
        pass

    def looper(self):

        while 1:
            try:
                T = Timer("self.my_func()")
                #T = Timer("polling.my_func()", "from __main__ import polling")
                time_elapsed = T.timeit(1)

                if math.ceil(time_elapsed) == 1:
                    print "Process is sleeped for 1 sec"
                    time.sleep(1)

            except KeyboardInterrupt:
                return

    def my_func(self):
        pass

if __name__ == '__main__':

    polling = PollingDemo()
    polling.looper()  

在这个例子中,我试图通过Timer类的timeit()方法调用PollingDemo类的my_func()方法,但我遇到了“NameError: global name 'self' is not defined”的错误。如果我们通过main来访问那个对象就没问题(下一行注释的代码运行得很好)。有人能告诉我为什么会这样吗?
谢谢大家。

2 个回答

2

如果你需要传递一些参数,可以直接使用 partial 这个工具,它来自 functools 这个模块。

import functools
import timeit

def printme(msg):
    print msg

print "Timing: %f" % timeit.timeit(functools.partial(printme, "Hello world"))
5

不要使用字符串,Timer 也可以接受可调用的对象,所以直接传递一个绑定到 self 的引用,也就是:

T = Timer(self.my_func)

(只传递引用,不要调用它)。

如果你需要更复杂的设置,还是把它放在一个函数或方法里,然后传递那个方法。

撰写回答