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程序员需要快速查看代码片段的执行时间时,它是一个非常方便的工具。