0

我正在尝试使用 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)?

4

2 回答 2

2

这正是您应该期待的。正如文档所说:

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

POSIX说 C 函数:

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

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

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

无论如何,报告的时间clock应该是<=挂钟时间,而不是==。

于 2013-07-11T19:02:00.587 回答
0

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

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

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

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

#or
timeit.timeit(primefunction)
于 2013-07-11T19:03:49.180 回答