python - 多处理执行比串行执行慢
问题描述
我正在尝试进行多处理,但在我的情况下,多处理似乎最终会比串行执行慢。我尝试了下面发布的代码段,结果对我来说比较慢。我想使用我拥有的所有处理器来执行。还有一件事,有没有办法提升 for 循环和嵌套的 for 循环。
import multiprocessing
import time
def add(a ,b ,c):
d = 0
for i in range(len(a)):
d = a[i] + b + c
return d
a = list()
for i in range(999999):
a.append(i)
b = a[2] + a[9]
c = a[3] + a[8]
#Serial
execTime = time.time()
res = add(a, b, c)
print "Serial: " + str(res) + " Exec Time: " + str(time.time() - execTime)
#Multiprocessing
execTimeMult = time.time()
resSet = [a, b, c]
cpu = multiprocessing.cpu_count()
pool = multiprocessing.Pool(cpu)
res = pool.apply(add, resSet)
print "Multiproc: " + str(res) + " Exec Time: " + str(time.time() - execTimeMult)
结果:
序列号:1000020 执行时间:0.0912199020386
多进程:1000020 执行时间:0.257400989532
解决方案
这并不奇怪。该Pool.apply
功能在单独的进程中执行,这意味着一些事情。正如@tripleee 的回答所提到的,启动该过程存在开销,尽管我认为这并不能解释一切。(这应该相对较快,并且远低于 100 毫秒。)
要考虑的第二件事是需要一些数据传输,在本例中是一个大约 8Mb 的列表。这必须在管道上移动,包括对物体进行酸洗和解酸。
如果你在函数中执行了更多的“工作”,你会看到相对差异下降,尽管常数因子是相似的。对于add
像下面这样的方法,我得到了0.96s
and的时间1.09s
。所以常数因子相同,但相对差异显然要小得多。
def add(a, b, c):
for _ in range(10):
d = 0
for i in range(len(a)):
d = a[i] + b + c
return d
推荐阅读
- javascript - 带有 PHP carbon 的 javascript 全文 Date() 格式
- sql-server - Powershell sql server模块2017手动安装
- c# - 如果目标中存在 blob,如何覆盖
- angular - 无法通过根组件中的 route.snapshot 访问路由参数
- r - tq_mutate() 抛出错误 - 循环编程技术
- c# - 使用 Oracle.ManagementDataAccess 绑定到输出字符串
- ruby-on-rails - RSpec/AnyInstance:避免使用allow_any_instance_of问题存根
- active-directory - 域用户无法登录新计算机
- pyspark - 带有 pySpark reduceByKey 的词袋
- c# - 如何在 Selenium/C# 中处理 Angular ng-click