我有一个蒙特卡洛模拟器,它有一个计算函数,它在一个循环中调用了很多次(数百万次或更多次)。为了加快速度,我想将其拆分为对模拟器的多个并行线程调用。IE。如果我想总共运行 100 万次,请将其拆分为 4 - 250,000 次并行运行。每个线程都使用相同的变量名,我该如何处理才不会发生冲突?我是否必须使用不同命名的变量创建 4 个单独版本的模拟器?
我已经开始使用 Python 线程模块编写一个版本,但可以肯定变量仍然存在问题。
有什么建议么?
谢谢你的时间。
凯尔
我有一个蒙特卡洛模拟器,它有一个计算函数,它在一个循环中调用了很多次(数百万次或更多次)。为了加快速度,我想将其拆分为对模拟器的多个并行线程调用。IE。如果我想总共运行 100 万次,请将其拆分为 4 - 250,000 次并行运行。每个线程都使用相同的变量名,我该如何处理才不会发生冲突?我是否必须使用不同命名的变量创建 4 个单独版本的模拟器?
我已经开始使用 Python 线程模块编写一个版本,但可以肯定变量仍然存在问题。
有什么建议么?
谢谢你的时间。
凯尔
如果您的代码是纯 Python,并且您使用的是 CPython,那么由于全局解释器 lock,线程可能不会加速您的代码。您可能正在寻找的是multiprocessing
模块,特别是它的Pool.map()
方法。
由于使用mulitprocessing
意味着使用单独的进程而不是单独的线程,因此锁定之类的问题将变得不那么重要。
也就是说,使用 NumPy 对代码进行矢量化或用 C 或 Cython 等高效编译语言编写内部循环可能比将其并行化到四个内核来加快速度。