Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用itertools产品并行计算函数_Python_Multiprocessing - Fatal编程技术网

Python 使用itertools产品并行计算函数

Python 使用itertools产品并行计算函数,python,multiprocessing,Python,Multiprocessing,我必须计算一个函数(我们称之为my_func()),它接受8个参数作为输入,并在不同的矩阵计算中返回标量。因为我对我的_func()没有任何约束,所以我别无选择,只能强行使用所有的可能性,这些可能性等于8^8=16777216。我开始使用itertools的乘积函数,并按顺序将生成的序列传递给my_func()。请看下面我的代码示例 到目前为止…… from itertools import product import numpy as np def my_func(a,b,c,d,e,f,

我必须计算一个函数(我们称之为my_func()),它接受8个参数作为输入,并在不同的矩阵计算中返回标量。因为我对我的_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
陷阱…

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
不幸的是,按顺序执行上述代码需要很长时间才能生成输出。这是因为我的裤子很重。我别无选择,只能以某种方式并行化这段代码,这样我就可以利用多个可用的处理器来运行我的代码

问题:

由于itertools.product是一个生成器,我无法将其并行化以同时计算不同参数集的_func()。 有什么方法可以并行化代码吗?如果答案是否定的,我是否应该放弃使用itertools的想法并尝试其他方法

请帮我找到解决办法

谢谢你的建议


干杯

您可以并联发电机!您可以使用
多处理
库,该库提供了
类,该类完全满足您的需要。您可以获得更丰富的文档,但本质上,您要做的是:

with Pool(processes=4) as pool:
  pool.map(my_func, itertools.product(Range, repeat=8))

您应该查看pool.map的备选方案,以找到最适合您的方案。

您将使用的内核数可能远小于88个

这导致了下面的平行化方案。拜访



另一方面,在实践中,这种方法在优化高维问题上效果很好,而且比暴力便宜得多。您可能希望尝试一下它的实现。

返回索引置换下的标量对称的函数是吗?如果我做f(1,0,0…,0),它是否返回与f(0,0…,1)相同的值?不幸的是,标量在置换下不是对称的,我希望它是对称的。该函数为不同的参数集返回不同的值。您的代码似乎缺少一行,例如其中的i:。顺便说一句,
my_func(*i)
比您的调用更紧凑。还考虑<代码>范围= [i / 2在范围(8)] < /代码>;如果您使用的是Python2,而没有使用来自导入部门的
@PM 2Ring的
,请将其设置为
i/2。
谢谢您的建议。我已经在代码中添加了缺少的那一行。干杯谢谢你的快速回复。我注意到,通过将itertools.product(Range,repeat=8)映射到我的函数,很快就会耗尽内存。我认为所有的8^8可能性都会生成、存储,然后作为块传递给不同的处理器。有什么解决办法吗?你可能想看看这里给出的答案:这里:你好,塔沃里博士,谢谢你的帮助。当然,通过8^8组合是一个很大的开销,事实上,参数的数量甚至会增加到10,然后我必须强制10^10,这是非常多的。我把你的答案读了好几遍,但还是想不起来。您是否建议在单个进程中仅使用参数子集(保持rest常量)来计算函数?请你在回答中再解释一下好吗?@Prdeep_nitro我已经添加了一个澄清/解释。如果你还需要什么,请告诉我。
def find_best_for_triplet(xyz):
    x, y, z = xyz[0], xyz[1], xyz[2]

    for ... in itertools.product(<all-combinations-of-last-5-parameters>)
        # Here you have all 8 of your parameters: x, y, z, and the last 5

    return xyz + (last-five-parameters) of the min