在下面的代码中,我正在生成一个数字9999的多维数据集,并通过线程池和常规方法调用它。
我正在计时两者之间的差异。似乎普通方法更快。我正在python 2.7终端中的具有16 gig ram的i7第八代英特尔处理器上运行此程序。
我对此感到困惑。可能是我缺少了一些东西。我希望这个问题对将来的人们有所帮助。
import time
from multiprocessing.pool import ThreadPool
def cube():
return 9999*9999*9999
print "Start Execution Threading: "
x = int(round(time.time() * 1000))
pool = ThreadPool()
for i in range(0,100):
result = pool.apply_async(cube, ())
result = pool.apply_async(cube, ())
result = pool.apply_async(cube, ())
# print result.get()
pool.close()
pool.join()
print "Stop Execution Threading: "
y = int(round(time.time() * 1000))
print y-x
print "Start Execution Main: "
x = int(round(time.time() * 1000))
for i in range(0,100):
cube()
cube()
cube()
print "Stop Execution Main: "
y = int(round(time.time() * 1000))
print y-x
答案 0 :(得分:3)
多处理意味着您将开始一个新线程。这带有很大的开销,因为必须对其进行初始化。这样,多线程仅在并行执行任务时才有回报,尤其是在python中,并行执行任务需要花费大量时间(与python启动时间相比),并且可以异步运行这些任务。
在您的情况下,简单的乘法运算执行得如此之快,将无济于事。
答案 1 :(得分:1)
由于".$1['$2']."
,您正在使用多线程而不是多处理。 CPython使用全局解释器锁来防止多个线程同时执行Python代码。
因此,由于您的程序受CPU限制,因此由于GIL而增加线程开销没有任何好处。多线程在Python中对于受IO限制的问题确实有意义,因为线程可以在其他人等待IO完成时运行。
您可以尝试使用真正的多处理程序,因为每个Python进程都会有自己的GIL,但是我仍然不确定这样做的好处,因为进程之间的通信会增加更多的开销...