如何使用 timeit 模块

465

如何使用timeit来比较自己编写的函数(例如“insertion_sort”和“tim_sort”)的性能?

15个回答

3
import timeit


def oct(x):
   return x*x


timeit.Timer("for x in range(100): oct(x)", "gc.enable()").timeit()

gc.enable()是什么? - Robin Andrews
在这些定时运行期间,激活通常被禁用的“垃圾收集”。 - aronadaal

2
这个问题已经有很多答案了,但是我想说的是,我觉得直接传递函数要比传递字符串(就像其他答案中所做的那样)或者使用包装器更加方便。例如:
import timeit

def my_sort(lst: list) -> list:
    do_something()

lst = [2, 3, 1]
timeit.timeit(lambda: my_sort(lst))

作为一个附注,```timeit.repeat```也非常有用,因为它返回一个时间列表,您可以使用它来执行自己的分析。我还会推荐perfplot,它在内部完成了大部分工作,并在最后生成了一个漂亮的图形。

1

使用Python REPL交互式解释器举例说明如何使用接受参数的函数。

>>> import timeit                                                                                         

>>> def naive_func(x):                                                                                    
...     a = 0                                                                                             
...     for i in range(a):                                                                                
...         a += i                                                                                        
...     return a                                                                                          

>>> def wrapper(func, *args, **kwargs):                                                                   
...     def wrapper():                                                                                    
...         return func(*args, **kwargs)                                                                  
...     return wrapper                                                                                    

>>> wrapped = wrapper(naive_func, 1_000)                                                                  

>>> timeit.timeit(wrapped, number=1_000_000)                                                              
0.4458435332577161                                                                                        

语法错误:位置参数跟随关键字参数。我在REPL和单独的文件中运行了它。 - Aaj Kaal
@VladBezden,timeit.timeit(lambda: naive_func(x), number=1_000_000) 有什么区别吗? - garej

1
内置的timeit模块最好从IPython命令行中使用。
要在模块内计时函数:
from timeit import default_timer as timer
import sys

def timefunc(func, *args, **kwargs):
    """Time a function. 

    args:
        iterations=3

    Usage example:
        timeit(myfunc, 1, b=2)
    """
    try:
        iterations = kwargs.pop('iterations')
    except KeyError:
        iterations = 3
    elapsed = sys.maxsize
    for _ in range(iterations):
        start = timer()
        result = func(*args, **kwargs)
        elapsed = min(timer() - start, elapsed)
    print(('Best of {} {}(): {:.9f}'.format(iterations, func.__name__, elapsed)))
    return result

1
你需要创建两个函数,然后运行类似这样的内容。 请注意,您要选择相同数量的执行/运行来进行苹果对比。
此代码在Python 3.7下测试通过。

enter image description here 以下是方便复制的代码

!/usr/local/bin/python3
import timeit

def fibonacci(n):
    """
    Returns the n-th Fibonacci number.
    """
    if(n == 0):
        result = 0
    elif(n == 1):
        result = 1
    else:
        result = fibonacci(n-1) + fibonacci(n-2)
    return result

if __name__ == '__main__':
    import timeit
    t1 = timeit.Timer("fibonacci(13)", "from __main__ import fibonacci")
    print("fibonacci ran:",t1.timeit(number=1000), "milliseconds")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接