Python timeit:如何在每次重复之前初始化定时函数的参数?

Python timeit: How to initialize arguments for timed function before every repetition?

假设我正在尝试测量排序函数的执行时间,这是我的代码:

import timeit

def time_algo(sort_fun, input_seq, num=100):
    '''
    Time how long it takes to sort sequence 'input_seq' using
    function 'sort_fun'. Take min of 'num' times.
    '''
    foo = list(input_seq)
    wrapped = wrapper(sort_fun, foo)
    return min(timeit.repeat(wrapped, repeat=num, number=1))

def wrapper(func, *args):
    def wrapped():
        return func(*args)
    return wrapped

print time_algo(list.sort, [10,9,8,7,6,5,4,3,2,1], num = 100)

问题是在第一次执行 sort_fun 之后,输入列表已经排序,并且在剩余的 num - 1 次中它在排序列表中 运行。

如何在每次重复函数计时之前初始化输入函数的参数(在本例中为执行 foo = list(input_seq))?或者使用 timeit 模块执行此操作的正确方法是什么(我需要准确的结果,所以我不想使用其他计时方法,如 time.clock() 等)?

我认为这个修改后的 time_algo() 符合您的要求:

def time_algo(sort_fun, input_seq, num=100):                                                        
    '''                                                                                             
    Time how long it takes to sort sequence 'input_seq' using                                       
    function 'sort_fun'. Take min of 'num' times.                                                   
    '''                                                                                             
    foo = list(input_seq)                                                                           
    wrapped = wrapper(sort_fun, foo)                                                                
    def reset_foo():                                                                                
        foo[:] = list(input_seq)                                                                    
    return min(timeit.timeit(wrapped, setup=reset_foo, number=1) for _ in range(num))

这会在每次 timeit() 之前重新复制 input_seq 以列出 foo。有不那么花哨/更手动的方法可以更通用:你可以编写一个简单的循环来复制输入,制作一个新的包装器,然后调用 timeit。

...但是正如上面所评论的那样,您确实需要每次迭代多次迭代,为此您真的希望为一个不修改其输入的函数计时。