使用 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读取时间。
答案 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()
,将会得到不希望的结果。