Python 时间

Vaibhhav Khetarpal 2023年1月30日 2022年5月18日
  1. timeit 的优点:
  2. 使用 timeit 模块比较两个片段的执行时间
  3. 使用 timeit 模块的命令行界面
Python 时间

timeit 模块是分析 Python 代码执行的所有类别工具中最简单和最容易实现的模块之一。本教程讨论了 Python 中 timeit 模块的使用和实现。

Python 包含一个内置库 timeit,可以计算 Python 代码小片段的执行时间。该模块通过运行给定的 python 代码数百万次来工作,并从所有可能的结果中预测在执行该代码期间经过的最少时间。

timeit 的优点:

  • 提供精确的有效结果。通过此函数呈现的执行时间的准确性比使用简单的 time 模块要高。
  • 它运行给定的代码片段超过一百万次,这提供了在其运行期间经过的时间的更多相关读数。
  • 除了通用的可调用接口外,还增加了命令行接口,易于理解和应用。

继续,让我们描述并关注 timeit 模块中 timeit() 函数的语法。

timeit.timeit(stmt, setup, timer, number)

timeit.timeit() 函数有四个参数,为了便于理解下面的函数,已经对所有参数进行了简要说明:

  • stmt:顾名思义,就是需要衡量的语句。在这种情况下,默认值为 pass
  • setup:表示在处理 stmt 之前必须运行的代码。再一次,它的默认值为 pass
  • timer:一个基本的 timeit.Timer 对象。它已经分配了一个不错的默认值,通常不需要更改。
  • number:表示程序员想要运行的给定代码片段的运行次数。

我们将看到如何实现来自 timeit 模块的 timeit.timeit() 函数的不同示例。

使用 timeit 模块计算简单代码片段的执行时间

此方法在三引号 (''') 之间的变量中定义代码片段。

以下代码使用 timeit 模块计算简单代码片段的执行时间。

import timeit
setup1 = "from math import sqrt"
code1 = '''
def a():
    list1 = []
    for i in range(50):
        list1.append(sqrt(i))
'''
print (timeit.timeit(setup = setup1,
                     stmt = code1,
                     number = 10000))

上面的程序以秒为单位提供执行时间的输出。该执行时间来自给定代码片段的一百万次迭代。

我们还应该注意,在 setup 参数中包含所有必要的 import 语句是很好的。

使用 timeit 模块比较两个片段的执行时间

timeit 模块还可用于比较两个给定代码片段的执行时间。在这里,我们将分别用于 Binary searchLinear Search 的两个函数并比较它们的执行时间。

以下代码使用 timeit 模块来比较两个片段的执行时间。

import timeit
 
# function for binary search
def b_s(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
 
 
# function for linear search
def l_s(mylist, find):
    for x in mylist:
        if x == find:
            return True
    return False
 
def b_time():
    SETUP_CODE = '''
from __main__ import b_s
from random import randint'''
    TEST_CODE = '''
mylist = [x for x in range(10000)]
find = randint(0, len(mylist))
b_s(mylist, find)'''
    times = timeit.repeat(setup = SETUP_CODE,
                          stmt = TEST_CODE,
                          repeat = 3,
                          number = 10000)
    print('Binary search time: {}'.format(min(times)))       
 
def l_time():
    SETUP_CODE = '''
from __main__ import l_s
from random import randint'''   
    TEST_CODE = '''
mylist = [x for x in range(10000)]
find = randint(0, len(mylist))
l_s(mylist, find)
    '''
    times = timeit.repeat(setup = SETUP_CODE,
                          stmt = TEST_CODE,
                          repeat = 3,
                          number = 10000)
    print('Linear search time: {}'.format(min(times))) 
 
if __name__ == "__main__":
    l_time()
    b_time()

使用 timeit 模块的命令行界面

让我们在命令行界面中获取一个简单的函数代码及其语法,并一次处理所有参数。

以下代码使用 timeit 模块的命令行界面。

C:\Windows\System32>python3 -m timeit -s "from math import sqrt" -n 10000 -r 5 'a = sqrt(34532)'

在这里,我们采用了与文章中第一个示例相同的功能。

继续,让我们考虑命令行界面中使用的所有参数。

  • timeit:一个简单的位置参数,指定 timeit 模块的存在和使用。
  • -s:设置参数。
  • -n:数字参数。
  • -r:重复的参数(可选)。
  • 'code snippet':代码片段直接写在命令行界面的单引号内。
Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn