Python 多处理似乎比常规执行慢
Python multiprocessing seems slower than regular execution
在下面的代码中,我正在生成数字 9999 的立方体并通过线程池和普通方法调用它。
我计时的区别是一样的。似乎正常的方法要快得多。我 运行 在 i7 第 8 代英特尔处理器上 python 2.7 终端内有 16 gig ram。
我对此感到困惑。可能是我遗漏了什么。希望这个问题对以后的人有所帮助
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
多处理意味着您将启动一个新线程。这带来了相当大的开销,因为它必须被初始化。因此,多线程只会带来回报,尤其是在 python 中,当您并行执行所有任务都需要相当长的时间(与 python 启动时间相比)并且可以允许 运行 异步。
在你的例子中,一个简单的乘法,执行得太快了,它不会得到回报。
由于 from multiprocessing.pool import ThreadPool
,您使用的是多线程而不是多处理。 CPython 使用全局解释器锁来防止多个线程同时执行 Python 代码。
因此,由于您的程序是 CPU 有界的,因此您添加了线程开销,但由于 GIL 而没有任何好处。多线程在 Python 中对于 IO 限制问题确实有意义,因为一个线程可以 运行 而其他线程正在等待 IO 完成。
您可以尝试使用真正的多处理,因为这样每个 Python 进程都会有自己的 GIL,但我仍然不确定收益,因为进程之间的通信会增加更多开销...
在下面的代码中,我正在生成数字 9999 的立方体并通过线程池和普通方法调用它。
我计时的区别是一样的。似乎正常的方法要快得多。我 运行 在 i7 第 8 代英特尔处理器上 python 2.7 终端内有 16 gig ram。
我对此感到困惑。可能是我遗漏了什么。希望这个问题对以后的人有所帮助
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
多处理意味着您将启动一个新线程。这带来了相当大的开销,因为它必须被初始化。因此,多线程只会带来回报,尤其是在 python 中,当您并行执行所有任务都需要相当长的时间(与 python 启动时间相比)并且可以允许 运行 异步。
在你的例子中,一个简单的乘法,执行得太快了,它不会得到回报。
由于 from multiprocessing.pool import ThreadPool
,您使用的是多线程而不是多处理。 CPython 使用全局解释器锁来防止多个线程同时执行 Python 代码。
因此,由于您的程序是 CPU 有界的,因此您添加了线程开销,但由于 GIL 而没有任何好处。多线程在 Python 中对于 IO 限制问题确实有意义,因为一个线程可以 运行 而其他线程正在等待 IO 完成。
您可以尝试使用真正的多处理,因为这样每个 Python 进程都会有自己的 GIL,但我仍然不确定收益,因为进程之间的通信会增加更多开销...