如何利用Python timeit模块精确测量小段代码的执行耗时?

云静同学_4475

云静同学_4475

2026-07-26

180人浏览

原创

timeit.timeit() 直接调用常不准,因其默认不关闭gc、仅运行100万次、字符串执行导致作用域失真;应改用timer类+repeat()取最小值,并通过setup和globals确保上下文一致。

如何利用python timeit模块精确测量小段代码的执行耗时?

timeit 是 Python 里最靠谱的小段代码计时工具,但它默认行为容易误导——比如不自动禁用 GC、不重复足够次数、不处理变量作用域,直接调 timeit.timeit() 得到的数字很可能偏小或抖动大。

为什么 timeit.timeit() 直接调用常不准?

默认只运行 100 万次(number=1000000),但对极快的代码(比如 x = 1 + 1)来说,CPU 调度、缓存预热、GC 干扰都会拉低结果可信度;更麻烦的是,传入的字符串代码在全局作用域执行,而实际业务中变量常在函数内定义,作用域差异会导致字节码不同、优化程度不同。

  • 不关 GC:垃圾回收可能在某次迭代中触发,耗时突增,拉高整体平均值
  • 没设 number:太小 → 统计噪声大;太大 → 可能溢出或耗时过长
  • 字符串形式传代码:无法复用局部变量,也不能用 nonlocal/global 声明

用 timeit.Timer 类 + repeat() 才算稳

绕开字符串限制,把待测逻辑封装成函数,再用 Timer 绑定该函数和 setup 逻辑(如导入、初始化),最后用 repeat(repeat=3, number=100000) 多轮跑——每轮独立计时,取最小值(排除系统干扰峰值)比平均值更反映真实性能。

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载
  • repeat=3 表示跑 3 轮,每轮执行 number 次
  • 选最小值而非平均值:系统中断、缓存未命中等偶然开销只会抬高单轮耗时,最小值更接近“理想路径”
  • setup 函数里做 import 和初始化:避免计入计时,且确保每次 repeat 都重置状态
import timeit
<p>def test_func():
return sum(range(100))</p><h1>正确姿势:分离 setup 和 stmt</h1><p>timer = timeit.Timer(stmt=test_func, setup='from <strong>main</strong> import test_func')
times = timer.repeat(repeat=3, number=100000)
print(min(times))  # 输出单位是秒
</p>

测量函数内联 vs 调用开销时,别漏掉 globals 参数

如果想对比 math.sqrt(4) 和 4 ** 0.5,必须让它们在相同作用域下运行,否则 math 模块查找路径不同会影响结果。用 globals=locals() 把当前命名空间透传进去,比写字符串拼接安全得多。

  • 字符串方式:timeit.timeit('math.sqrt(4)', setup='import math') —— math 在 setup 里导入,但 stmt 字符串执行时仍要解析名字
  • 函数方式:timeit.timeit(lambda: math.sqrt(4), globals=locals()) —— math 已在当前 scope,无查找开销
  • 注意:globals=locals() 仅适用于测试代码在模块顶层或函数内,不能在类方法里直接用

微秒级代码要警惕 CPU 时间精度和时钟源

timeit 底层用 time.perf_counter(),在多数现代系统上精度达纳秒级,但实际分辨率取决于 OS 和硬件。Windows 上 perf_counter() 可能只有 15ms 分辨率(尤其旧版本),导致 number 太小时测出来全是 0.0。

  • 遇到结果为 0.0 或极小(如 2.3e-07),先增大 number 到 10 万以上再看
  • Linux/macOS 一般没问题;Windows 用户建议升级到 Python 3.7+,并确认系统开启了高精度定时器
  • 不要用 time.clock()(已弃用)或 time.time() 替代 —— 它们受系统时间调整影响,不适合基准测试

真正难的不是调哪个函数,而是让被测代码处在和生产环境一致的上下文里:同样的作用域、同样的导入链、同样的 GC 状态。少一次 setup 错误,比多跑十轮 timeit 更接近真相。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python python程序 python包

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1731

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4404

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1709

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25857

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3147

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3167

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2463

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习