首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么time.clock比time.time占用更长的时间?

为什么time.clock比time.time占用更长的时间?
EN

Stack Overflow用户
提问于 2015-01-09 15:19:10
回答 1查看 3.5K关注 0票数 8

我使用time.clocktime.time在Ubuntu上计时了一段python代码。

代码语言:javascript
复制
clock elapsed time: 8.770 s
time  elapsed time: 1.869 s

我知道time.time使用系统时间,time.clock使用处理器时钟。当time.time给出比time.clock更长的运行时间时,这对我来说是有意义的:处理器只是在整个时间内没有活动(例如,调用time.sleep的时间)。

但是,为什么/何时处理器时钟会给出比系统时间大得多的时间呢?

增编

我用一个标准映射、一个进程池映射和一个线程池映射对相同的函数进行了粗略的测试。可以理解,进程池更快,线程池更慢。更有趣的是:时钟计时小于处理器池的时间计时,但在线程池中则更大。

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

结果:

代码语言:javascript
复制
map
  time  1738.8
  clock 1739.6
mp pool
  time   580.1
  clock   15.9
thread pool
  time  3455.3
  clock 5378.9

代码:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-09 16:57:37

如果在多个CPU上执行,CPU时间可能会超过墙壁时间。我在Python中没有具体看到这一点,但是在使用clock函数与C中的多个线程一起使用时,我确实看到了这一点,而且大概Python代码只是直接调用这个C函数。

关于“为什么”:你想错了。重要的是有多少核心在运行你的程序。如果一个核心在2秒的时间内运行1秒,这对你来说是有意义的,但如果四个核心在同一时间间隔内运行1秒,又会怎样呢?然后你有4秒的CPU时间和2秒的墙时间。内核负责测量所有内核的CPU时间。如果多个核心在同一秒钟内运行,那么在这一秒内您会花费多个CPU秒。这是对调度程序重要的成本度量,也可能是clock所基于的度量。这可能不是你所关心的度量,但这就是它的工作原理。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27863717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档