为什么 time.clock 给出的经过时间比 time.time 长?
Why is time.clock giving a greater elapsed time than time.time?
我使用 time.clock
和 time.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
建立的指标。这可能不是您关心的指标,但这就是它的工作原理。
我使用 time.clock
和 time.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
建立的指标。这可能不是您关心的指标,但这就是它的工作原理。