例如,相同的代码在 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 中进行更深入的剖析?
最佳答案
你的 3.7 比 3.8 快似乎真的很奇怪
理由3.8应该比3.7快
可能的罪魁祸首- pickle 模块中的默认协议(protocol)现在是协议(protocol) 4(pickle 用于发送 args 并从子进程接收返回值)
- 减少了转换传递给许多内置函数和方法的参数的开销(也可能有利于从 pickle 流中解包参数)
不太可能是罪魁祸首
- 通过将展开 block 堆栈的逻辑移至编译器,简化了解释器循环。
- 所有 GC 跟踪对象(例如元组、列表、字典)的大小都减少了 4 或 8 个字节。
不同操作的多个 python 版本的速度变化示例(也是 3.8 更新日志的页面):
关于python - 为什么 Anaconda 中的多处理比 Python 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66248018/