Python多处理脚本中的打印时间返回负时间

时间:2014-04-27 12:07:30

标签: python python-2.7 time multiprocessing

使用 Python 2.7.6在 Ubuntu 14 上运行

我简化了脚本以显示我的问题:

import time
import multiprocessing

data = range(1, 3)
start_time = time.clock()


def lol():
    for i in data:
        print time.clock() - start_time, "lol seconds"


def worker(n):
    print time.clock() - start_time, "multiprocesor seconds"


def mp_handler():
    p = multiprocessing.Pool(1)
    p.map(worker, data)

if __name__ == '__main__':
    lol()
    mp_handler()

输出:

8e-06 lol seconds
6.9e-05 lol seconds
-0.030019 multiprocesor seconds
-0.029907 multiprocesor seconds

    Process finished with exit code 0

使用time.time()会给出非负值(如Timer shows negative time elapsed所示) 但我很好奇python time.clock()multiprocessing的问题是什么,以及从CPU读取时间。

2 个答案:

答案 0 :(得分:10)

multiprocessing生成进程,而linux上的time.clock()与C clock()的含义相同:

  

返回的值是到目前为止使用的 CPU时间作为clock_t;

因此,clock返回的值会在进程启动时从0重新启动。但是,您的代码使用父级的进程start_time来确定子进程所花费的时间,如果子进程重置CPU时间,这显然是不正确的。

处理一个进程时,clock()函数只有 ,因为它的返回值是花费的CPU时间处理。子进程被考虑在内。

另一方面,time()函数使用系统范围的时钟,因此甚至可以在不同的进程之间使用(尽管它单调,因此可能返回错误的结果如果有人在事件期间改变了系统时间。)

分叉正在运行的python实例可能比从头开始新的更快,因此start_time几乎总是大于time.clock()返回的值。 考虑到父进程还必须在磁盘上读取您的文件,执行可能需要读取其他.py文件,搜索目录等的导入。 分叉子进程不必完成所有操作。


示例代码显示time.clock()的返回值重置为0

from __future__ import print_function

import time
import multiprocessing

data = range(1, 3)
start_time = time.clock()


def lol():
    for i in data:
        t = time.clock()
        print('t: ', t, end='\t')
        print(t - start_time, "lol seconds")


def worker(n):
    t = time.clock()
    print('t: ', t, end='\t')
    print(t - start_time, "multiprocesor seconds")


def mp_handler():
    p = multiprocessing.Pool(1)
    p.map(worker, data)

if __name__ == '__main__':
    print('start_time', start_time)
    lol()
    mp_handler()

结果:

$python ./testing.py 
start_time 0.020721
t:  0.020779    5.8e-05 lol seconds
t:  0.020804    8.3e-05 lol seconds
t:  0.001036    -0.019685 multiprocesor seconds
t:  0.001166    -0.019555 multiprocesor seconds

请注意t案例的lol是单调的,而另一种情况下0.001的情况则是{{1}}。

答案 1 :(得分:1)

要在上面的Bakuriu出色答案中添加简洁的Python 3示例,可以使用以下方法获取独立于子进程的全局计时器:

import multiprocessing as mp
import time

# create iterable
iterable = range(4)

# adds three to the given element
def add_3(num):
    a = num + 3
    return a

# multiprocessing attempt
def main():
    pool = mp.Pool(2)
    results = pool.map(add_3, iterable)    
    return results

if __name__ == "__main__":  #Required not to spawn deviant children    
    start=time.time()

    results = main()
    print(list(results))

    elapsed = (time.time() - start)  
    print("\n","time elapsed is :", elapsed)

请注意,如果我们改用time.process_time()而不是time.time(),将会得到不希望的结果。