Python 优化包含网格的双回路

Python 优化包含网格的双回路,python,numpy,optimization,Python,Numpy,Optimization,我正在做一个双循环来求和一个函数,该函数以网格作为输入。问题是它运行得很慢。。。我想用另一个过程优化代码,也许使用numpy的矢量化函数,但我不知道如何实现。我向您展示我拥有的代码: import numpy as np import time Lxx = 2. Lyy = 1.0 dxx = dyy = 0.01 nxx = 100 nyy = 100 XX, YY = np.meshgrid(np.arange(0, Lxx+dxx, dxx), np.arange(0, Lyy+dyy,

我正在做一个双循环来求和一个函数,该函数以网格作为输入。问题是它运行得很慢。。。我想用另一个过程优化代码,也许使用numpy的矢量化函数,但我不知道如何实现。我向您展示我拥有的代码:

import numpy as np
import time

Lxx = 2.
Lyy = 1.0
dxx = dyy = 0.01
nxx = 100
nyy = 100
XX, YY = np.meshgrid(np.arange(0, Lxx+dxx, dxx), np.arange(0, Lyy+dyy, dyy)) #mesh grid


def solution(xx,yy,nnmax,mmmax):
    sol = 0.
    for m in range(nnmax):
        for n in range(mmmax):
           sol = sol+np.sin(XX*0.356*n)+np.cos(YY*2.3*m)
    return sol


start = time.time()  
solution(XX,YY,nxx,nyy)
end = time.time()   
print ("TIME", end-start)

我要做的是,对nxx,nyy中的大值求和。当然,这需要很多时间……这就是我想要优化代码的原因。

如果您注意到,总和的项是完全可分离的:它们不共享任何循环变量。因此,您可以为
XX
n
YY
m
上的和创建独立(较小)数组,并获取触发函数和这些函数的和。最终的网格可以通过广播累积

首先,不要费心制作网格:

x = np.arange(0, Lxx+dxx, dxx)
y = np.arange(0, Lyy+dyy, dyy)
使用广播计算单个总和:

n = np.arange(nyy)[:, None]
m = np.arange(nxx)[:, None]
sumx = np.sin(x + 0.356 * n).sum(0)
sumy = np.cos(y + 2.3 * m).sum(0)
您可以使用相同的广播技巧获得网格中的最终和:

result = sumx[:, None] + sumy

好的,是的,你是对的。但是,如果我有一个乘积而不是一个和会发生什么呢?np.sin(XX*0.356*n)*np.cos(YY*2.3*m)@Joe
prodx=np.prod(np.sin(x*0.356*n))
result=prodx[:,None]+prody
@Joe。每个二进制ufunc都有一个reduce方法,所以不用担心
prod
基本上是
np.multiply.reduce