Timeit 在函数内部不起作用

Ann*_*nna 5 python timeit

我只是在 python 中玩timeit,下面的代码工作正常:

def mysleep(n):
    import time
    time.sleep(n)

import timeit
for k in range (1,5):
    def mytime():
        mysleep(k)
    t1 = timeit.Timer("mytime();", "from __main__ import mytime") 
    print k, t1.timeit(1)  
Run Code Online (Sandbox Code Playgroud)

但如果我将相同的代码放入一个函数中,则每次的k时间约为 3 秒。

def mytest(): 
    import timeit
    for k in range (1,5):
        def mytime():
            mysleep(k)
        t1 = timeit.Timer("mytime();", "from __main__ import mytime") 
        print k, t1.timeit(1)  

mytest()
Run Code Online (Sandbox Code Playgroud)

为什么我的函数内的代码不起作用以及如何修复它?

Mar*_*ers 2

您的设置语句mytime() 从模块 globals导入,但您在函数局部变量中定义了要测试的函数。因此,设置语句要么失败(如果您也没有全局函数),要么导入错误的对象。 mytime()

就您而言,您还必须有一个全局mytime()函数,每次调用它时仍需要 3 秒的时间来运行。

timeit.Timeit()还可以将可调用对象作为参数而不是字符串;直接传入函数mytime()

def mytest(): 
    import timeit
    for k in range (1,5):
        def mytime():
            mysleep(k)
        t1 = timeit.Timer(mytime) 
        print k, t1.timeit(1)  
Run Code Online (Sandbox Code Playgroud)

现在不需要导入该对象。这只适用于不带参数的可调用函数,并且使用这样的函数会为所有定时调用增加少量开销。