📜  Python中的 Timeit 示例

📅  最后修改于: 2022-05-13 01:55:48.817000             🧑  作者: Mango

Python中的 Timeit 示例

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

为什么要定时?

  • 那么,使用一个简单的时间模块怎么样?只需节省代码执行前后的时间并减去它们!但是这种方法并不精确,因为可能会暂时运行一个后台进程,这会中断代码执行,并且您会在小代码片段的运行时间上得到显着变化。
  • timeit 运行您的代码片段数百万次(默认值为 1000000),以便您获得统计上最相关的代码执行时间测量!
  • timeit 使用起来非常简单,并且具有命令行界面和可调用界面。

所以现在,让我们开始探索这个方便的图书馆吧!

模块函数timeit.timeit(stmt, setup, timer, number)接受四个参数:

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

timeit.timeit()函数返回执行代码所用的秒数。

示例 1
让我们先看一个基本的例子。

Python3
# importing the required module
import timeit
 
# code snippet to be executed only once
mysetup = "from math import sqrt"
 
# code snippet whose execution time is to be measured
mycode = '''
def example():
    mylist = []
    for x in range(100):
        mylist.append(sqrt(x))
'''
 
# timeit statement
print (timeit.timeit(setup = mysetup,
                     stmt = mycode,
                     number = 10000))


Python3
# importing the required modules
import timeit
 
# binary search function
def binary_search(mylist, find):
    while len(mylist) > 0:
        mid = (len(mylist))//2
        if mylist[mid] == find:
            return True
        else if mylist[mid] < find:
            mylist = mylist[:mid]
        else:
            mylist = mylist[mid + 1:]
    return False
 
 
# linear search function
def linear_search(mylist, find):
    for x in mylist:
        if x == find:
            return True
    return False
 
 
# compute binary search time
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 statement
    times = timeit.repeat(setup = SETUP_CODE,
                          stmt = TEST_CODE,
                          repeat = 3,
                          number = 10000)
 
    # printing minimum exec. time
    print('Binary search time: {}'.format(min(times)))       
 
 
# compute linear search time
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 statement
    times = timeit.repeat(setup = SETUP_CODE,
                          stmt = TEST_CODE,
                          repeat = 3,
                          number = 10000)
 
    # printing minimum exec. time
    print('Linear search time: {}'.format(min(times))) 
 
if __name__ == "__main__":
    linear_time()
    binary_time()


  • 上述程序的输出将是传递给timeit.timeit()函数的代码片段 10000 次迭代的执行时间(以秒为单位)。
    注意:注意输出的是代码片段的number次迭代的执行时间,而不是单次迭代。对于单个迭代执行。时间,将输出时间除以数字
  • 该程序非常简单。我们需要做的就是将代码作为字符串传递给timeit.timeit()函数。
  • 建议在 setup 参数中保留 import 语句和其他静态代码。

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

Python3

# importing the required modules
import timeit
 
# binary search function
def binary_search(mylist, find):
    while len(mylist) > 0:
        mid = (len(mylist))//2
        if mylist[mid] == find:
            return True
        else if mylist[mid] < find:
            mylist = mylist[:mid]
        else:
            mylist = mylist[mid + 1:]
    return False
 
 
# linear search function
def linear_search(mylist, find):
    for x in mylist:
        if x == find:
            return True
    return False
 
 
# compute binary search time
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 statement
    times = timeit.repeat(setup = SETUP_CODE,
                          stmt = TEST_CODE,
                          repeat = 3,
                          number = 10000)
 
    # printing minimum exec. time
    print('Binary search time: {}'.format(min(times)))       
 
 
# compute linear search time
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 statement
    times = timeit.repeat(setup = SETUP_CODE,
                          stmt = TEST_CODE,
                          repeat = 3,
                          number = 10000)
 
    # printing minimum exec. time
    print('Linear search time: {}'.format(min(times))) 
 
if __name__ == "__main__":
    linear_time()
    binary_time()
  • 上述程序的输出将是列表中的最小值times
    这是示例输出的样子:

  • 下面说明如何使用命令行
  • timeit.repeat()函数接受一个额外的参数repeat 。输出将是重复指定编号的所有代码运行的执行时间列表。次。
  • 在 setup 参数中,我们通过了:
from __main__ import binary_search
from random import randint
  • 这将导入已在程序和随机库函数randint中定义的函数binary_search的定义。
  • 正如预期的那样,我们注意到二分搜索的执行时间明显低于线性搜索!

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

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

因此,这是对timeit模块及其实际应用的简要介绍。
当Python程序员需要快速查看代码片段的执行时间时,它是一个非常方便的工具。