【问题标题】:Huge discrepancy between Python time.clock() and Sublime Text 2 timingPython time.clock() 和 Sublime Text 2 计时之间的巨大差异
【发布时间】:2013-07-11 18:54:07
【问题描述】:

我正在尝试使用 Python 的 time 模块比较两种不同算法的运行时间,以确定数字是否为素数,例如:

test = primesComparisonTXT()
start = time.clock()
print 'Fermat Method'
for prime in test:
    print isFermatProbablePrime(prime, 5)
total = time.clock() - start
print total

primesComparisonTXT() 是一个函数,它返回 (1, 1000000) 中已确认的素数列表。

isFermatProbablePrime() 是一个函数,它接受 1. 一个可疑素数 2. 一个参数,该参数指示应该使用费马的素数测试对可疑素数进行多少次素性测试。该函数根据嫌疑人是否是可能的素数返回 True 或 False。 (http://en.wikipedia.org/wiki/Fermat_primality_test)

该算法正确输出该列表中的每个素数确实是可能的素数,但我得到的时间结果大不相同。 4.57107920129 打印为“总计”,但 Sublime Text 声明构建为“[在 15.1 秒内完成]”。 Sublime 的计时更准确。这种差异有什么特别的原因吗?也许应该使用更好的计时方法(timeit)?

【问题讨论】:

  • primesComparisonTXT() 需要多长时间?
  • 0.0783992072275s 根据 time.clock(),0.3s 根据 Sublime
  • 如果你想要实际的持续时间,你应该使用 time.time()。
  • 或者,如果您要测试完整脚本的时间,只需使用time 命令,它实际上会显示时钟时间和处理器时间,后者分解为用户和系统/内核。

标签: python sublimetext2


【解决方案1】:

这正是您应该期待的。正如the docs 所说:

在 Unix 上,将当前处理器时间作为浮点数返回,以秒为单位。精度,实际上是“处理器时间”含义的定义,取决于同名 C 函数的精度……

POSIX 表示 C 函数:

... 应返回实现对进程使用的处理器时间的最佳近似值,因为该实现定义的时代开始时仅与进程调用相关。

换句话说,这是处理器时间,而不是挂钟时间。如果您的处理器正在执行其他任何操作(例如,运行其他程序),或者在您的程序阻塞 I/O 时等待无所事事,则不计算在内。

实际上,甚至比这更糟糕——这样的时间可能在某些 Unix 和类 Unix 系统上算,而 在 Windows 上算……所以如果你不不了解你的平台,不一定容易理解clock 的真正含义。

无论如何,clock 报告的时间应该是

【讨论】:

  • 所以 Sublime 的时间是挂钟时间?
  • @djlovesupr3me:很可能,是的。
【解决方案2】:

这不是您在 python 中进行计时的方式。

使用timeit模块:http://docs.python.org/2/library/timeit.html

将您的代码包装在一个函数中,然后使用:

import timeit
timeit.timeit("primefunction()", setup='from mymodule import primefunction')

#or
timeit.timeit(primefunction)

【讨论】:

  • 或者只是timeit.timeit(primefunction)
  • 为什么时间文档说明 time.clock():“......但无论如何,这是用于对 Python 或计时算法进行基准测试的函数”?
  • 不知道。这就是 timeit 的用途。
  • @djlovesupr3me:首先,这是因为您正在查看 2.x 文档;请注意3.3 明确弃用clock。其次,如果您想自己构建类似timeit 的东西,这是您将使用的功能(在2.7 中)。但是正确地做这件事比仅仅减去两个clock 值要复杂得多。您可以阅读 timeit 所做的事情(在文档或源代码中),但除非您知道自己在做什么并且需要做一些不同的事情,否则请使用 timeit
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多