📜  Python中的Timeit与示例

📅  最后修改于: 2020-04-14 01:01:07             🧑  作者: Mango

本文将向您介绍一种测量Python代码段执行时间的方法。
我们将使用内置的Python库timeit
该模块提供了一种简单的方法来查找少量Python代码的执行时间。

为什么需要时间模块?

  • 好吧,如何使用简单的时间模块?只需节省执行代码前后的时间,然后减去它们!但是这种方法并不精确,因为可能会暂时运行后台进程,这会中断代码执行,并且您会在小代码段的运行时间上看到很大的差异。
  • timeit运行您的代码片段数百万时间(默认值为1000000),以便您获得统计上最相关的代码执行时间度量!
  • timeit使用起来非常简单,具有命令行界面以及可调用的界面。

现在,让我们开始探索这个方便的库!
模块函数timeit.timeit(stmt,setup,timer,number)接受四个参数:

  • stmt这是您要测量的语句;它默认为“通过”。
  • 设置是运行stmt之前运行的代码; 它默认为“通过”。
    我们通常使用它为我们的代码导入所需的模块。
  • 计时器,它是一个timeit.Timer对象;它通常具有合理的默认值,因此您不必担心它。
  • number是您要运行stmt的执行次数。

timeit.timeit()函数返回的秒数花来执行代码。
例子1
首先让我们看一个基本的例子。

# 导入所需的模块
import timeit
# 代码段只能执行一次
mysetup = "from math import sqrt"
# 要评估其执行时间的代码段
mycode = '''
def example():
    mylist = []
    for x in range(100):
        mylist.append(sqrt(x))
'''
# 时间声明
print timeit.timeit(setup = mysetup,
                    stmt = mycode,
                    number = 10000)
  • 上面程序的输出将是传递给timeit.timeit()函数的代码片段的10000次迭代的执行时间(以秒为单位)。注意:请注意以下事实:输出是代码片段迭代次数乘以执行时间,而不是单次迭代。对于单次迭代执行。时间,将输出时间除以数字
  • 该程序非常简单。我们需要做的就是将代码作为字符串传递给timeit.timeit()函数。
  • 建议将import语句和其他静态代码段保留在setup参数中。

例子2
让我们看另一个实际的示例,在该示例中我们将比较两种搜索技术,即Binary搜索Linear search
另外,在这里我演示了另外两个功能,timeit.repeat函数和调用程序中已经定义的函数。

# 导入所需的模块
import timeit
# 二进制搜索功能
def binary_search(mylist, find):
    while len(mylist) > 0:
        mid = (len(mylist))//2
        if mylist[mid] == find:
            return True
        elif mylist[mid] < find:
            mylist = mylist[:mid]
        else:
            mylist = mylist[mid + 1:]
    return False
# 线性搜索功能
def linear_search(mylist, find):
    for x in mylist:
        if x == find:
            return True
    return False
# 计算二进制搜索时间
def binary_time():
    SETUP_CODE = '''
from __main__ import binary_search
from random import randint'''
    TEST_CODE = '''
mylist = [x for x in range(10000)]
find = randint(0, len(mylist))
binary_search(mylist, find)'''
    # timeit.repeat语句
    times = timeit.repeat(setup = SETUP_CODE,
                          stmt = TEST_CODE,
                          repeat = 3,
                          number = 10000)
    
    print('Binary search time: {}'.format(min(times)))
# 计算线性搜索时间
def linear_time():
    SETUP_CODE = '''
from __main__ import linear_search
from random import randint'''
    TEST_CODE = '''
mylist = [x for x in range(10000)]
find = randint(0, len(mylist))
linear_search(mylist, find)
    '''
    # timeit.repeat语句
    times = timeit.repeat(setup = SETUP_CODE,
                          stmt = TEST_CODE,
                          repeat = 3,
                          number = 10000)
    # 提升最低执行力时间
    print('Linear search time: {}'.format(min(times)))
if __name__ == "__main__":
    linear_time()
    binary_time()
  • 上述程序的输出将是列表时间中的最小值。
    这是示例输出的样子:
  • timeit.repeat()函数接受一个额外的参数repeat。输出将是重复指定编号后所有代码运行的执行时间的时间列表。
    • 在设置参数中,我们通过了:
      from __main__ import binary_search
      from random import randint
      • 这将导入已经在程序中定义的binary_search函数的定义以及随机库函数randint
      • 不出所料,我们注意到二进制搜索的执行时间明显少于线性搜索!

      示例3
      最后,我在下面演示如何利用timeit模块的命令行界面:

      在这里,我将分别解释每个术语:

      因此,这是对timeit模块及其实际应用的简短而简洁的介绍。
      对于Python程序员来说,当他们需要快速浏览一下代码片段的执行时间时,它是一个非常方便的工具。