语境:
- 我正在使用 SciPy 的差分进化包开发优化器。使用worker = 1,我得到了一些不错的结果,但我想加快运行时间。
- 我已经检查了以下关于如何在 scipy.optimize.differential_evolution 中启用并行的线程?即使我添加
if __name__ == "main":
并设置workers = -1,运行时也完全相同。我在本地机器(2 个物理处理器,4 个逻辑处理器)或我们的服务器环境(16 个核心)上测试了我的代码 - 我测试了以下用例https://medium.com/@grvsinghal/speed-up-your-code-using-multiprocessing-in-python-36e4e703213e。更改工作人员的数量确实会影响运行时间,因此我的笔记本电脑和服务器上的并行处理工作也是如此。
- 因此,我的假设是我定义目标和约束函数的方式可能是问题所在。
伪代码:
- 该代码用于工作,所以我不能分享它。我的目标和约束函数需要很多常量,因此我将它们包装成一个类。我知道该
args
参数是为此,但约束函数没有该参数。 - 代码结构如下所示:
class MyClass:
def __init__(configuration, array1, array2, dataframe):
# assigning attributes so that
self.something = datafame[column1]
...
def obj(self, x):
# based on the initialized values + optimized parameters, it calculates the objective
def cons(self, x):
# based on the initialized values + optimized parameters, it calculates the constraint violations
然后,我创建一个类实例o = MyClass()
,并用类模块调用差分进化函数:differential_evolution(func = o.obj, ...)
.
问题:
- 有没有人遇到过以下问题,即即使您设置了多个工作人员,代码也运行在一个工作人员上?
- 您对如何更好地设计目标和约束函数以使它们有资格进行并行处理有什么建议吗?
谢谢!