我有以下代码:
import time
from threading import Thread
from multiprocessing import Process
def fun1():
for _ in xrange(10000000):
print 'in fun1'
pass
def fun2():
for _ in xrange(10000000):
print 'in fun2'
pass
def fun3():
for _ in xrange(10000000):
print 'in fun3'
pass
def fun4():
for _ in xrange(10000000):
print 'in fun4'
pass
if __name__ == '__main__':
#t1 = Thread(target=fun1, args=())
t1 = Process(target=fun1, args=())
#t2 = Thread(target=fun2, args=())
t2 = Process(target=fun2, args=())
#t3 = Thread(target=fun3, args=())
t3 = Process(target=fun3, args=())
#t4 = Thread(target=fun4, args=())
t4 = Process(target=fun4, args=())
t1.start()
t2.start()
t3.start()
t4.start()
start = time.clock()
t1.join()
t2.join()
t3.join()
t4.join()
end = time.clock()
print("Time Taken = ",end-start)
'''
start = time.clock()
fun1()
fun2()
fun3()
fun4()
end = time.clock()
print("Time Taken = ",end-start)
'''
我以三种方式运行了上述程序:
对end_time-start时间的观察如下:
总运行时间
问题 :
我看到顺序执行花费的时间最少,而多线程处理花费的时间最多。为什么?我无法理解,也对结果感到惊讶。请澄清。
由于这是一项占用大量CPU的任务并且需要GIL,因此我的理解是多处理将花费最少的时间,而线程执行将花费最多的时间。请验证我的理解。
您使用time.clock
wich会给您CPU时间,而不是实时的时间:您无法在这种情况下使用它,因为它会给您执行时间(您使用CPU多长时间运行代码,wich几乎是同一时间对于每种情况)
运行您的代码time.time()
而不是time.clock
给我这些时间在我的计算机上:
Process : ('Time Taken = ', 5.226783990859985)
seq : ('Time Taken = ', 6.3122560000000005)
Thread : ('Time Taken = ', 17.10062599182129)
此处给出的任务(打印)是如此之快,以至于使用多重处理所带来的速度几乎被开销所平衡。
对于Threading
,由于GIL的缘故,您只能运行一个线程,因此最终将依次运行所有函数,但是却产生了线程管理的开销(每几次迭代更改一次线程每次可能要花费几毫秒的时间)。因此,您最终得到的结果要慢得多。
Threading
如果您有等待时间,此功能很有用,因此您可以在两者之间运行任务。
Multiprocessing
如果可能完全独立(没有共享变量),则对于计算量大的任务很有用。如果您需要共享变量,则必须面对GIL,这会稍微复杂一些(但在大多数情况下并非不可能)。
编辑:实际上,time.clock
像您一样使用确实为您提供了有关使用Threading
和Multiprocessing
花费多少开销的信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句