Python timeit精确测量代码执行时间与性能对比

木白
木白
发布时间:2026-10-11 | 2人浏览过
原创

介绍在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高效开发与性能调优的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表