【问题标题】:Python multiprocessing library Pool.map()Python 多处理库 Pool.map()
【发布时间】:2019-01-30 14:52:25
【问题描述】:
def myfun(a):
return a*2

p=Pool(5)

k0=time.time()
p.map(myfun,[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10])
k1=time.time()
print(k1-k0)

k0=time.time()
for i in [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]:
  myfun(i)
k1=time.time()
print(k1-k0)

我在 python 中使用多处理包。如您所见,我分别执行了两个不同的 sn-ps 代码。使用 Pool.map 的第一个比串行执行的第二个花费更多时间。谁能向我解释为什么会这样?我认为 p.map() 会快得多。不是并行执行的吗?

【问题讨论】:

  • 我从未使用过Pool.map(),但我可以通过 Java 或 C 肯定地告诉你,在小数据上,无论你使用多少线程,它的运行速度总是比使用一个线程慢,因为“启动”这些线程等需要时间。尝试用严肃的for 运行代码,比如数千个步骤,你会看到一些好的结果。如果我错了,对不起,我只是告诉你我在 Java 或 C 方面的经历。

标签: python python-multiprocessing multiprocess


【解决方案1】:

确实如 cmets 中所述,对于 multiprocessing 的某些任务,并行运行需要更长的时间。对于非常小的任务,这是预期的。原因是您必须为每个使用的工作人员在每个进程上启动一个 python 实例,并且您还必须序列化和发送您使用map 发送的函数和数据。这需要一些时间,因此使用multiprocessing.Pool 会产生开销。对于非常快速的任务,我建议使用multiprocessing.dummy.Pool,它使用线程——从而最大限度地减少设置开销。

尝试在你的函数调用中加入time.sleep(x),并改变x。你会看到随着x的增加,函数变得更适合在线程池中运行,然后在进程池中运行更昂贵的x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-11
    • 2015-01-12
    • 2013-10-02
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2017-04-02
    • 2019-04-17
    相关资源
    最近更新 更多