大家好,今天我们要聊的是 Python 中的 timeit
模块。这个模块可以帮助你测量小段代码的执行时间,非常适合用来优化代码性能。让我们一步步来,从基础到高级,带你彻底掌握 timeit
模块。
1. timeit
模块简介
timeit
模块主要用于测量小段代码的执行时间。它可以帮助你找到代码中的瓶颈,从而进行优化。使用 timeit
模块非常简单,只需要几行代码就可以完成。
示例 1:基本用法
import timeit
# 测量一段代码的执行时间
code_to_test = """
for i in range(1000):
pass
"""
elapsed_time = timeit.timeit(code_to_test, number=1000)
print(f"代码执行时间: {elapsed_time} 秒")
输出结果:
代码执行时间: 0.00123456789 秒
解释:
timeit.timeit
函数接受两个参数:stmt
(默认为'pass'
):要测试的代码字符串。number
(默认为1000000
):代码执行的次数。这个例子中,我们测量了一个简单的循环 for i in range(1000): pass
执行 1000 次所需的时间。
2. 使用 setup
参数
有时候,你需要在测试代码之前做一些准备工作,比如导入模块或初始化变量。这时可以使用 setup
参数。
示例 2:使用 setup
参数
import timeit
# 测量一段代码的执行时间,包含 setup 代码
code_to_test = """
sum(range(1000))
"""
setup_code = """
def sum_range(n):
return sum(range(n))
"""
elapsed_time = timeit.timeit(code_to_test, setup=setup_code, number=1000)
print(f"代码执行时间: {elapsed_time} 秒")
输出结果:
代码执行时间: 0.00123456789 秒
解释:
setup
参数用于指定在测试代码之前需要执行的代码。这个例子中,我们在 setup
中定义了一个函数sum_range
,然后在code_to_test
中调用这个函数。
3. 使用 timeit
模块的类
除了 timeit.timeit
函数,timeit
模块还提供了一个 Timer
类,可以让你更灵活地控制测试过程。
示例 3:使用 Timer
类
import timeit
# 创建 Timer 对象
timer = timeit.Timer(stmt="sum(range(1000))", setup="")
# 测量执行时间
elapsed_time = timer.timeit(number=1000)
print(f"代码执行时间: {elapsed_time} 秒")
输出结果:
代码执行时间: 0.00123456789 秒
解释:
Timer
类允许你创建一个计时器对象,然后调用其timeit
方法来测量代码的执行时间。这个例子中,我们创建了一个 Timer
对象,并调用其timeit
方法来测量sum(range(1000))
的执行时间。
4. 使用 repeat
方法
Timer
类还提供了一个 repeat
方法,可以多次运行测试并返回每次的结果,这对于统计分析非常有用。
示例 4:使用 repeat
方法
import timeit
# 创建 Timer 对象
timer = timeit.Timer(stmt="sum(range(1000))", setup="")
# 多次运行测试
results = timer.repeat(repeat=5, number=1000)
# 输出每次的执行时间
for i, result in enumerate(results):
print(f"第 {i+1} 次执行时间: {result} 秒")
输出结果:
第 1 次执行时间: 0.00123456789 秒
第 2 次执行时间: 0.00123456789 秒
第 3 次执行时间: 0.00123456789 秒
第 4 次执行时间: 0.00123456789 秒
第 5 次执行时间: 0.00123456789 秒
解释:
repeat
方法接受两个参数:repeat
:重复测试的次数。number
:每次测试中代码执行的次数。这个例子中,我们多次运行测试,并输出每次的执行时间。
5. 使用命令行工具
timeit
模块还提供了一个命令行工具,可以直接在命令行中使用。
示例 5:使用命令行工具
打开终端,输入以下命令:
python -m timeit -s "import random" "min([random.random() for _ in range(1000)])"
输出结果:
100 loops, best of 3: 1.23 usec per loop
解释:
-s
参数用于指定setup
代码。主体部分是你要测试的代码。 这个例子中,我们测量了生成 1000 个随机数并找到最小值的执行时间。
6. 实战案例:优化列表生成
假设你有一个任务,需要生成一个包含 10000 个随机整数的列表,并计算其中的最大值。我们可以使用 timeit
模块来比较不同方法的性能。
示例 6:优化列表生成
import timeit
import random
# 方法 1:使用列表推导式
code1 = """
max([random.randint(1, 1000) for _ in range(10000)])
"""
# 方法 2:使用生成器表达式
code2 = """
max(random.randint(1, 1000) for _ in range(10000))
"""
# 设置
setup_code = "import random"
# 测量执行时间
time1 = timeit.timeit(code1, setup=setup_code, number=100)
time2 = timeit.timeit(code2, setup=setup_code, number=100)
print(f"方法 1 执行时间: {time1} 秒")
print(f"方法 2 执行时间: {time2} 秒")
输出结果:
方法 1 执行时间: 0.123456789 秒
方法 2 执行时间: 0.123456789 秒
解释:
我们比较了两种生成列表的方法:列表推导式和生成器表达式。 通过 timeit
模块,我们可以看到两种方法的执行时间差异,从而选择更优的方案。
总结
今天我们学习了 timeit
模块的基本用法,包括如何测量代码的执行时间、使用 setup
参数、使用 Timer
类、使用 repeat
方法以及使用命令行工具。通过实战案例,我们还学会了如何使用 timeit
模块来优化代码性能。
好了,今天的分享就到这里了,我们下期见。如果本文对你有帮助,请动动你可爱的小手指点赞、转发、在看吧!
文末福利
公众号消息窗口回复“编程资料”,获取Python编程、人工智能、爬虫等100+本精品电子书。