为什么 time.clock 给出的经过时间比 time.time 长?

Why is time.clock giving a greater elapsed time than time.time?

我使用 time.clocktime.time 为 Ubuntu 上的一段 python 代码计时:

clock elapsed time: 8.770 s
time  elapsed time: 1.869 s

我知道 time.time 使用系统时间而 time.clock 使用处理器时钟。当 time.time 给出比 time.clock 更长的经过时间时,这对我来说很有意义:处理器在整个时间都没有处于活动状态(例如调用 time.sleep 的时间)。

但是 why/when 处理器时钟会给出比系统时间的经过时间吗?


附录

我用标准图、进程池图和线程池图粗略地计算了相同的函数。可以理解,进程池更快,线程池更慢。更有趣的是:时钟计时 less 与处理器池的时间计时相比,但 greater 在线程池中。

再次,我理解为什么处理器池的时钟计时较少:大概主进程不做太多事情,只是等待池进程完成。但是为什么时钟计时更多的是用线程池呢?有什么见解吗?

结果:

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)

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

关于"why":你想错了。重要的是有多少 个内核运行正在运行您的程序。如果一个核心 运行 秒在两秒的墙时间过程中持续一秒,这对您来说是有意义的,但是如果四个核心每个 运行 秒在同一时间间隔内持续一秒呢?然后你有 4 秒的 CPU 时间在 2 秒的墙上时间。内核占测量所有内核的 CPU 时间。如果在同一秒内有多个核心 运行,那么您在那一秒内花费了多 CPU 秒。这是对调度程序很重要的成本度量,并且大概是 clock 建立的指标。这可能不是您关心的指标,但这就是它的工作原理。