Python 为什么time.clock给出的时间比time.time更长?

Python 为什么time.clock给出的时间比time.time更长?,python,linux,multithreading,time,multiprocessing,Python,Linux,Multithreading,Time,Multiprocessing,我在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) 但是为什么/什么时候处理器时钟给出的经过时间比系统时间大得多

我在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
代码:


如果在多个CPU上执行,CPU时间可能会超过墙时间。我在Python中没有具体看到过这一点,但我在使用带有多个C线程的
clock
函数时肯定看到过这一点,并且推测Python代码只是直接调用这个C函数


关于“为什么”:你的想法是错误的。重要的是有多少内核在运行您的程序。如果一个内核在两秒钟的墙时间内运行一秒钟,这对您来说是有意义的,但是如果四个内核在同一时间间隔内各运行一秒钟会怎么样。然后,在2秒的墙壁时间内,您有4秒的CPU时间。内核负责测量所有内核的CPU时间。如果多个内核在同一秒钟内运行,那么您在该秒钟内花费了多个CPU秒。这是对调度器很重要的成本度量,大概这就是
clock
构建的度量标准。这可能不是您关心的指标,但它就是这样工作的。

类似的东西?你是用8核运行吗?是的,这也是我的怀疑。那么时钟是否给出了所有处理器经过的时钟时间?可能是操作系统特有的,但我在许多计时工具/libsSee中看到了类似的问题,可以很好地解释挂钟和处理器时钟时间之间的差异。@LukasGraf:实际上,motw的解释是不正确的。阅读的当前版本-函数行为依赖于平台,并且自Python 3.3以来已被弃用。即使在Linux上的Python2上,也不应将其用于性能度量。使用
timeit.default\u timer
,无论Python版本如何,它都会为您的系统提供最佳的性能度量计时器。从经验上看,似乎就是这样。为什么?的文档只是简单地陈述了这一事实。我试图找出原因。处理器时钟的测量值是多少?它似乎可以测量处理器处于活动状态的时间量,但这并不完全准确,因为处理器处于活动状态的时间不能超过实际经过的时间(或者可以,因为多线程在硬件级别的工作方式?)(即不是一个bug)。但它没有解释原因。@jmiloy:在我的系统上
time.clock()
调用C函数,该函数是使用
clock\u gettime(clock\u PROCESS\u CPUTIME\u ID)
实现的,它不计算子进程的CPU时间,而是计算CPU时间(“执行时间”)对于每个线程,这就是为什么多核CPU上的多线程进程的时钟时间可能大于挂机时间的原因。@jfs您可以将其作为答案发布,这非常有用。
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)