【发布时间】:2022-01-25 01:10:24
【问题描述】:
我的一个 Python 程序使用 multiprocessing 模块来并行化搜索问题的迭代。除了做其他事情之外,每次迭代都会循环一个已经在 Cython 中优化的 CPU 昂贵的过程。因为这个进程在循环时会被多次调用,这会显着减慢总运行时间。
在这种情况下,实现加速的推荐方法是什么?由于无法对昂贵的进程进行进一步的 CPU 优化,因此我考虑了并行化循环。但是,由于循环存在于已经并行化的(multiprocessing)程序中,我认为这在同一台机器上是不可能的。
我对此的研究未能找到任何最佳实践或任何方向。
【问题讨论】:
-
这不是我的专业领域,但您是否考虑过使用无 GIL 的 Python 实现并让进程产生线程?
-
您是指 CPython 还是 Cython?没有什么神奇的方法可以让程序使用比实际可用更多的资源。您唯一的方法是更有效地使用它们,或者在第一个无法完成的情况下重新考虑(仅)使用其他计算资源。你确定计算真的是最优的吗?根据我的经验,大多数 Python 代码离最佳时间还很远。例如:你使用最好的算法吗?最好的数据结构? CPython 的开销可以忽略不计吗?当前的代码是否可以很好地扩展?等等。我们需要更多信息来帮助您。
-
@JérômeRichard 这是 Cython(已更正)。对于上下文,代码在以下方法上花费了大量时间,该方法针对速度进行了优化:github.com/statsmodels/statsmodels/blob/main/statsmodels/tsa/…
-
有趣!该代码似乎使用了 L-BFGS 算法,该算法应该是计算界限的。它还使用了一些 Numpy 函数(例如 log 和 sum),这些函数可能没有针对您的平台进行很好的优化。我很难看出哪一部分是瓶颈。如果您使用与您的需求匹配的上下文/输入(例如并行使用)来调用它的最小可重现示例,那么我将尝试检查代码是否可以进一步改进。我认为还有改进的余地,但代码已经使用 Numpy 并且 Numpy 代码非常好。所以不要指望会有巨大的进步。
标签: python performance optimization parallel-processing python-multiprocessing