我正在尝试比较两种不同算法的运行时间,以确定数字是否为素数,使用Python的时间模块,例如:
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是打印为“total”的内容,但是Sublime Text声明该版本是“[在15.1s完成]”。 Sublime的时机更准确。这种差异是否有任何特殊原因;也许应该使用更好的计时方法(timeit)?
答案 0 :(得分:2)
这正是您应该期待的。正如the docs所说:
在Unix上,将当前处理器时间返回为以秒为单位的浮点数。精确度,实际上是“处理器时间”含义的定义,取决于同名C函数的精度......
POSIX说C函数:
...应该返回实现的最佳近似值,这是自从与进程调用相关的实现定义时代开始以来进程使用的处理器时间。
换句话说,这是处理器时间,而不是挂钟时间。如果您的处理器正在执行任何其他操作(例如,运行其他程序),或者在程序阻塞I / O时无所事事,则不会计算它。
实际上,情况甚至更糟 - 这样的时间可以计算在某些Unix和类Unix系统上,将计算在Windows上...所以如果你不这样做理解你的平台,理解clock
实际意味着什么并不一定容易。
无论如何,clock
报告的时间应该是< =挂钟时间,而不是==。
答案 1 :(得分: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)