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 search
和 Linear 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 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