您当前位置:首页 > 深入 Python > 性能调优 > 使用 timeit 模块 | << >> | ||||
深入 Python从 Python 新手到专家 |
关于优化 Python 代码,您需要知道的最重要的事情是,您不应该编写自己的计时函数。
对一小段代码进行计时是非常复杂的。您的计算机为运行这段代码投入了多少处理器时间?后台是否运行着其他程序?您确定吗?每台现代计算机都在后台运行着进程,有些进程一直在运行,有些进程则间歇性地运行。Cron 作业会按固定间隔触发;后台服务偶尔会“唤醒”来执行一些有用的操作,例如检查新邮件、连接到即时消息服务器、检查应用程序更新、扫描病毒、检查在过去 100 纳秒内是否有磁盘插入 CD 驱动器,等等。在开始计时测试之前,请关闭所有程序并断开网络连接。然后关闭您第一次忘记关闭的所有内容,然后关闭不断检查网络是否已恢复的服务,然后……
然后是计时框架本身引入的变化。 Python 解释器是否缓存了方法名称查找?它是否缓存了代码块编译?正则表达式呢?如果您的代码运行多次,是否会有副作用?不要忘记,您处理的是几分之一秒的时间,因此计时框架中的小错误会不可挽回地扭曲您的结果。
Python 社区有一句谚语:“Python 自带电池。” 不要编写自己的计时框架。 Python 2.3 自带一个非常棒的计时框架,名为 timeit。
如果您还没有下载,您可以 下载本书中使用的这个示例和其他示例。
>>> import timeit >>> t = timeit.Timer("soundex.soundex('Pilgrim')", ... "import soundex")>>> t.timeit()
8.21683733547 >>> t.repeat(3, 2000000)
[16.48319309109, 16.46128984923, 16.44203948912]
![]() |
|
您可以在命令行上使用 timeit 模块来测试现有的 Python 程序,而无需修改代码。有关命令行标志的文档,请参阅 https://docs.pythonlang.cn/lib/node396.html。 |
请注意,repeat() 返回一个时间列表。由于 Python 解释器获得的处理器时间略有不同(以及您无法摆脱的那些讨厌的后台进程),这些时间几乎不会完全相同。您的第一个想法可能是说“让我们取平均值,并将其称为真实数字。”
事实上,这几乎可以肯定是错误的。花费时间较长的测试并不是因为您的代码或 Python 解释器存在差异而花费的时间较长;它们花费的时间较长是因为那些讨厌的后台进程,或者 Python 解释器之外的其他因素,而您无法完全消除这些因素。如果不同的计时结果相差超过几个百分点,那么您的结果仍然存在太多变数,无法信任。否则,请取最小时间并丢弃其余时间。
Python 有一个方便的 min 函数,它接受一个列表并返回最小的值
>>> min(t.repeat(3, 1000000)) 8.22203948912
![]() |
|
只有当您已经知道需要优化哪段代码时,timeit 模块才会起作用。如果您有一个更大的 Python 程序,并且不知道性能问题出在哪里,请查看 hotshot 模块。 |
<< 性能调优 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
优化正则表达式 >> |