Python timeit精确测量代码执行时间与性能对比
介绍在Python中如何准确测量代码执行时间。指出传统time.time()方法易受系统干扰且精度不足,进而详解timeit模块的核心参数、timeit()与repeat()函数的实际调用方式,以及命令行界面的快捷用法,帮助开发者高效进行代码性能基准测试与算法对比。
为什么推荐使用 timeit?
在Python中测量代码段的执行时间时,传统的做法是使用 time.time() 记录前后时间差。这种方法存在明显缺陷:
- 对于极短的代码片段,手动计算的精度往往无法满足需求。
- 操作系统中同时运行的其他进程会占用CPU资源,导致
time.time()捕获的时间波动较大,难以反映代码真实的运行效率。
为解决这些性能测试中的常见陷阱,Python提供了内置的 timeit 模块。该模块专门用于高精度测量少量Python代码的执行时间,既提供可编程接口,也支持命令行直接调用。
核心函数 timeit.timeit() 用法解析
timeit.timeit() 是模块中最常用的函数,主要用于执行指定的代码语句并返回消耗的时间(单位为秒)。其核心参数定义如下:
stmt:待测量的代码语句(默认为'pass')。setup:在执行stmt之前仅运行一次的初始化代码(通常用于导入模块或声明变量)。timer:底层定时器对象,保持默认设置即可满足绝大多数场景。number:指定stmt连续执行的次数。
该函数最终返回的是 stmt 执行 number 次的总耗时(秒)。若需计算单次平均耗时,只需将返回值除以迭代次数。
第1步:定义初始化环境与待测语句
为了准确计时,应将依赖库的导入放在 setup 参数中,避免将其计入核心逻辑的耗时。以下是测量数学运算的标准写法:
# setup_code 仅在循环开始前执行一次
setup_code = "from math import sqrt"
# stmt_code 将按 'number' 参数指定的次数重复执行
stmt_code = "sum(sqrt(x) for x in range(1, 10000))"
iterations = 10000
import timeit
time_taken = timeit.timeit(stmt=stmt_code, setup=setup_code, number=iterations)
print(f"总耗时为: {time_taken} 秒")
print(f"单次迭代的时间为: {time_taken / iterations}")
第2步:对比不同函数的执行效率
当需要对比两种算法或内置函数的性能时,建议结合 timeit.repeat() 使用。该函数相比 timeit() 增加了一个 repeat 参数,允许对同一测试进行多次独立循环,从而返回一个耗时列表。取该列表的最小值,可以有效规避偶然性的系统卡顿,得出最稳定的基准数据。
import timeit
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
def make_random_array():
from random import randint
return [randint(-100, 100) for _ in range(20)]
test_array = make_random_array()
def compare_functions():
# setup_code1 需同时导入自定义函数与测试数据
setup_code1 = """\nfrom __main__ import bubble_sort\nfrom __main__ import test_array\n"""
# setup_code2 仅需导入共享数据
setup_code2 = """\nfrom __main__ import test_array\n"""
stmt_code1 = "bubble_sort(test_array.copy())"
stmt_code2 = "sorted(test_array)"
# 各执行 10000 次,整体重复测试 5 轮,返回 5 个耗时数值组成的列表
times1 = timeit.repeat(stmt=stmt_code1, setup=setup_code1, number=10000, repeat=5)
times2 = timeit.repeat(stmt=stmt_code2, setup=setup_code2, number=10000, repeat=5)
print(f"气泡排序最佳耗时: {min(times1)}")
print(f"内置 sorted 最佳耗时: {min(times2)}")
if __name__ == "__main__":
compare_functions()
在上述示例中,通过提取两次测试返回列表中的最小值,可以直观地看出内置 sorted() 在C层面的高度优化,其运行速度远超手工编写的冒泡排序。
利用命令行界面快速验证
除了编写Python脚本外,timeit 模块还自带了强大的命令行工具。通过终端直接运行 python -m timeit,可以快速评估单行代码或表达式的性能,非常适合临时的性能校验:
python -m timeit [-n N] [-r N] [-s S] 'statement'
关键参数说明:
-n N:每个循环执行statement的次数。-r N:总共重复循环的次数(默认值为5)。-s S:在执行前预加载的初始化语句。-u U:输出单位,可选择 nano、micro、milli、sec。
实用示例如下:
验证常规查找运算符的性能:
$ python -m timeit -s 'text = "sample string"; char = "g"' 'char in text'
5000000 loops, best of 5: 0.0877 usec per loop
验证内置方法的性能:
$ python -m timeit -s 'text = "sample string"; char = "g"' 'text.find(char)'
1000000 loops, best of 5: 0.342 usec per loop
命令行模式下省略参数会自动采用合理的默认值。这种无需编辑文件即可快速跑分的方式,极大提升了日常调试与算法选型时的效率。
总结
以上就是Python timeit精确测量代码执行时间与性能对比的详细内容,更多关于Python高效开发与性能调优的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













