【问题标题】:Why multiprocessing in Anaconda is slower than in Python为什么 Anaconda 中的多处理比 Python 慢
【发布时间】:2021-02-17 18:38:09
【问题描述】:

例如,anaconda 环境中的相同代码运行速度明显慢于裸 python 环境

import multiprocessing as mp
from tqdm.auto import tqdm

def summer(i):
    return i+i

with mp.Pool(6) as pool:
    data = range(100000)
    results = tqdm(pool.imap_unordered(summer, data), total=len(data))
    results = list(results)
    pool.close()
    pool.join()

python 环境中的时间:

$time python testscript.py 
100%|████████████████████████████| 100000/100000 [00:02<00:00, 45094.94it/s]

real    0m2,316s
user    0m3,953s
sys     0m1,525s

conda 环境中的时间:

$time python testscript.py 
100%|████████████████████████████| 100000/100000 [00:03<00:00, 26315.68it/s]

real    0m3,873s
user    0m6,157s
sys     0m1,912s

它的根本原因是什么?尝试使用 viztracer 分析代码,但它只是表明 Summer() 需要更长的时间来执行。 追问:有没有办法在python中进行更深入的剖析?

【问题讨论】:

  • 由于这不是一个详尽的分析,我建议您包括更多信息:至少python -VV 两者;最好是其他人可以复制的最小环境定义。
  • @merv 谢谢,你把我推向了解决方案!看来我的 conda 使用 python 3.8.5,而我的 python env 是 3.7.5。而且,根据源代码,multiprocessing/pool.py 中有一些变化。我使用与我的系统完全相同的 python 版本创建了 conda env,它们现在可以在相当的时间运行(conda 仍然稍微慢一点)。但我还是想知道,为什么python版本之间的速度差异如此之大?

标签: python anaconda multiprocessing profiling


【解决方案1】:

你的 3.7 比 3.8 快看起来真的很奇怪

原因 3.8 应该比 3.7 快

可能的罪魁祸首
  • pickle 模块中的默认协议现在是协议 4(pickle 用于发送 args 并从子进程接收返回)
  • 减少了转换传递给许多内置函数和方法的参数的开销(也可能有利于从 pickle 流中解包 args)

不太可能的罪魁祸首

  • 已通过将展开块堆栈的逻辑移至编译器来简化解释器循环。
  • 所有 GC 跟踪的对象(例如元组、列表、字典)的大小都减少了 4 或 8 个字节。

多个版本的 python 用于各种操作的速度变化示例(也是 3.8 更改日志的页面):

https://docs.python.org/3/whatsnew/3.8.html#demos-and-tools

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2020-10-14
    • 1970-01-01
    • 2014-08-14
    • 2021-11-03
    相关资源
    最近更新 更多