我在Ubuntu上使用time.clock
和time.time
计时了一段Python代码:
clock elapsed time: 8.770 s
time elapsed time: 1.869 s
我理解time.time使用系统时间,而time.clock使用处理器时钟。当time.time给出的经过时间大于time.clock时,这对我来说是有道理的:处理器并非一直处于活动状态(例如,调用time.sleep)。
但是为什么/何时处理器时钟给出的经过时间会比系统时间多得如此之多呢?
附加说明
我进行了一个简单的测试,在标准映射、进程池映射和线程池映射中计算相同的函数。可以理解的是,进程池更快,线程池更慢。更有趣的是:在处理器池中,时钟计时小于时间计时,但在线程池中时钟计时却更长。
再次强调,我理解处理器池中时钟计时更短的原因:主进程不做太多事情,只等待池进程完成。但是为什么在线程池中时钟计时更长呢?有什么见解吗?
结果:
map
time 1738.8
clock 1739.6
mp pool
time 580.1
clock 15.9
thread pool
time 3455.3
clock 5378.9
代码:
from time import clock, sleep, time
from multiprocessing.pool import ThreadPool
from multiprocessing import Pool
import random
def f(i):
x = [random.random() for j in range(100000)]
return x[i]
def t(fn):
t0, c0 = time(), clock()
for i in range(10): fn(f,range(16))
print ' time ', round(1000*(time()-t0),1)
print ' clock', round(1000*(clock()-c0),1)
if __name__ == '__main__':
print 'map'
t(map)
pool = Pool(8)
print 'mp pool'
t(pool.map)
pool = ThreadPool(8)
print 'thread pool'
t(pool.map)
time.clock()
文档的当前版本——该函数的行为取决于平台,并且自Python 3.3以来已被弃用。即使在Linux上使用Python 2,也不应将其用于性能测量。使用timeit.default_timer
,它可以为您提供最佳的计时器,无论Python版本如何,在您的系统上进行性能测量。 - jfs