python - 为什么相同的python代码有不同的时钟时间?
问题描述
我正在使用以下 python 代码对我的服务器进行基准测试:
import time
initial_clock = time.clock()
res = 0
for i in range(1, 10000000):
res += i * i
print (time.clock() - initial_clock)
当我多次运行它时,我会得到从2.163377
几秒到2.970836
几秒的不同执行时间。我知道由于 CPU 负载的变化,相同的代码可能具有不同的执行时间,但正如time.clock
文档中所说,它只考虑当前进程时钟,因此time.clock()
即使使用不同,它也应该具有相同的执行时间time.time()
。不应该吗?
还有无论如何我可以获得clock
一段python代码的准确计数吗?
编辑:我使用time.process_time()
并得到相同的结果。
解决方案
计时码的第一条规则:使用timeit
模块。这会自动为您的操作系统选择最佳计时器,最大限度地减少其他影响,并进行多次计时运行,以便为您提供最准确的时间估计。
接下来,time.clock()
不是过程特定的。这是 CPU 上的时钟时间,是的,但不是当前进程使用 CPU 所花费的时间。计划在 CPU 上运行的其他进程会增加所用时间的波动。你想time.process_time()
改用。
但是,所有代码都受到潜在缓存和特定于 Python 的周期性进程(例如垃圾收集器运行)的影响。您不能期望得到可重复的time.clock()
或time.process_time()
值,因为该时钟无法解释 Python 进程本身中的此类后台工作。您可以在计时代码时禁用垃圾收集器进程(timeit
为您执行此操作),但这对内部缓存没有帮助(这是特定于实现的,大多数没有记录)。
timeit
用于time.perf_counter()
包括花费在 I/O 和其他可能由被测代码启动的进程上的时间。time.process_time()
您可以通过在用作命令行脚本-p
时使用开关或在调用 API 函数时传递来告诉它使用。timeit
timer=time.process_time
推荐阅读
- c# - BPost地址验证C# REST调用不成功
- c++ - OpenGL中的旋转立方体
- java - 如何在反应原生应用程序中使用 FLAG_INSISTENT
- apache-kafka - 如何通过拉取查询在 Kafka 和 ksqldb 中获取摘要/聚合表
- apache-spark - DataBricks 集群 - Spark 作业停止而没有任何进展
- python - 如何使用线程从while循环中获取参数的值?
- .net - 引发无法加载文件“System.Web.Entity”。在项目 .net 上
- flutter - Flutter 插件大小是否必须小于 10 MB?
- java - 与正则表达式键匹配的复杂房间多对多关系
- oracle - PL/SQL 性能分页游标(具有过滤和固定结果大小)