【问题标题】:Handling variables in function with parallel spawning in Python在 Python 中通过并行生成处理函数中的变量
【发布时间】:2011-12-14 03:10:07
【问题描述】:

我有一个蒙特卡洛模拟器,它有一个计算函数,它在一个循环中调用了很多次(数百万次或更多次)。为了加快速度,我想将其拆分为对模拟器的多个并行线程调用。 IE。如果我想总共运行 100 万次,请将其拆分为 4 - 250,000 次并行运行。每个线程都使用相同的变量名,我该如何处理才不会发生冲突?我是否必须使用不同命名的变量创建 4 个不同版本的模拟器?

我已经开始使用 Python 线程模块编写一个版本,但可以肯定变量仍然存在问题。

有什么建议吗?

感谢您的宝贵时间。

凯尔

【问题讨论】:

  • 我真的不知道模拟是关于什么的,但如果它(例如)在每次迭代中使用一个列表项,您可以使用偏移量将其拆分,即 thread 1: f(m[x]), thread 2: f(m[x+1]), ... thread n: f(m[x+(n-1)]) 然后递增 @987654323 @ 按线程数 x += n。另外,请考虑使用cython

标签: python parallel-processing simulation montecarlo


【解决方案1】:

如果您的代码是纯 Python,并且您使用的是 CPython,由于global interpreter lock,线程可能不会加速您的代码。您可能正在寻找的是multiprocessing module,特别是它的Pool.map() method

由于使用mulitprocessing 意味着使用单独的进程而不是单独的线程,因此锁定之类的问题将变得不那么重要。

也就是说,使用 NumPy 对代码进行矢量化处理或使用 C 或 Cython 等高效编译语言编写内部循环可能比将代码并行化到四个内核的速度快得多。

【讨论】:

  • 我同意转换为 NumPy 会加快速度。但是添加并行化也应该能够提供很大的加速。没有理由不同时使用!
  • 我使用的是标准的纯 Python,所以我猜它也被称为 CPython。我都准备好使用 NumPy 并阅读了一些关于矢量化的内容,但仍然没有完全理解它。由于我的模拟基本上是大约 15 次涉及相当线性的物理计算(即下一个方程依赖于前一个方程),我不确定我是否能够解决所有这些依赖关系。我从未听说过 Cython,但会开始阅读它和 Pool.map。谢谢你的建议,我会告诉你结果如何。
  • 我明白了!我的解决方案是按照建议使用多处理,尽管我没有使用 pool.map() 方法。只需根据我希望加载的内核数调用作为 multiprocessing.Process 对象的修改版本的类,我就能得到我想要的。通过编写完整的多线程版本以及多处理如何解决这个问题,我已经完全了解了 GIL 的烦恼。谢谢你的建议!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2020-05-13
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多