我正在尝试加快我的代码,目前在Python/Numpy中运行需要一个多小时。大部分计算时间发生在下面粘贴的函数中。在
我试图将Z矢量化,但我发现对于三重for循环来说,这相当困难。我可以在某处实现numpy.diff
函数吗?看看:
def MyFESolver(KK,D,r,Z):
global tdim
global xdim
global q1
global q2
for k in range(1,tdim):
for i in range(1,xdim-1):
for j in range (1,xdim-1):
Z[k,i,j]=Z[k-1,i,j]+r*q1*Z[k-1,i,j]*(KK-Z[k-1,i,j])+D*q2*(Z[k-1,i-1,j]-4*Z[k-1,i,j]+Z[k-1,i+1,j]+Z[k-1,i,j-1]+Z[k-1,i,j+1])
return Z
tdim = 75
xdim = 25
我同意,这很棘手,因为四面的BCs破坏了刚度矩阵的简单结构。可以这样删除空间循环:
但我不认为你能摆脱时间循环。。。在
我认为这句话:
^{pr2}$用numpy制作一个拷贝,而你想要的是一个视图——如果你能想出怎么做的话——它应该更快(多少钱?)在
最后,我同意其他回答者的观点——根据经验,这种循环最好用C语言完成,然后包装成numpy。但是上面的速度应该比原来的快。。。在
这看起来是赛顿的理想案例。我建议用Cython编写这个函数,可能会快几百倍。在
相关问题 更多 >
编程相关推荐