【发布时间】:2016-07-03 21:16:58
【问题描述】:
我必须评估一个函数(我们称之为 my_func()),它接受 8 个参数作为输入,并在不同的矩阵计算中返回一个标量。由于我对 my_func() 没有任何约束,我别无选择,只能强行强制所有等于 8^8 = 16777216 的可能性。我开始使用 itertools 的产品函数并将生成的序列依次传递给 my_func() .请看下面我的代码示例,
到目前为止.....
from itertools import product
import numpy as np
def my_func(a,b,c,d,e,f,g,h): #Function that I have to evaluate
#do some matrix computations and return some scalar q#
return q
def Evaluate():
Range = [x for x in np.arange(0,3.60,0.5)] # A list that contains 8 elements
it = itertools.product(Range, repeat=8) #Generate all possiblities
Max = 0
for i in it:
Sum = my_func(*i)
if Sum > Max:
Max = present
return Max
Result = Evaluate() #Output
陷阱...
不幸的是,按顺序执行上述代码需要很长时间才能产生输出。这是因为 my_func 非常重。我别无选择,只能以某种方式并行化这段代码,以便我可以利用多个处理器来运行我的代码。
问题:
由于 itertools.product 是一个生成器,我无法将其并行化以同时针对不同的参数集评估 my_func()。 有什么办法可以并行化代码吗?如果不是,我应该放弃使用 itertools 的想法并尝试其他方法吗?
请帮我找到解决办法。
感谢您提出任何想法。
干杯!!
【问题讨论】:
-
是在索引排列下返回标量对称的函数吗?如果我执行 f(1,0,0...,0) 是否返回与 f(0,0,...,1) 相同的结果?
-
不幸的是,标量在排列下不是对称的,我希望它本来就是这样。该函数为不同的参数集返回不同的值。
-
您的代码似乎缺少一行,例如
for i in it:。顺便说一句,my_func(*i)比您的电话更紧凑。也可以考虑Range = [i/2 for i in range(8)];如果您在 Python 2 上而不使用from __future__ import division,请使用i/2.。 -
@PM 2Ring 感谢您的建议。我已将缺少的行添加到我的代码中。干杯!!