代码之家  ›  专栏  ›  技术社区  ›  Tony Babarino

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

  •  2
  • Tony Babarino  · 技术社区  · 8 年前

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

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

    1 回复  |  直到 8 年前
        1
  •  3
  •   Pierce    8 年前

    我认为这个修改了 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重新复制到listfoo。有更少的花哨/更多的手动方式可以更通用:您可以编写一个简单的循环来复制输入,创建一个新的包装器,并调用timeit。

    …但正如上面所评论的,您确实需要每次迭代多次,因此,您确实希望对一个不修改其输入的函数进行计时。