首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:帮助优化代码

Python:帮助优化代码
EN

Stack Overflow用户
提问于 2014-07-11 15:59:02
回答 2查看 188关注 0票数 1

我有一个程序,用来计算矩形网格中的单元中心。网格大小相当大(650列乘1150行)。代码运行得非常慢。我想知道是否可以使用任何技巧来减少下面的示例runtime.In,deltax是列间隔的一维数组,deltay是行间隔的一维数组。

代码语言:javascript
复制
center_x = np.empty((nrow,ncol),dtype ='double')
center_y = np.empty((nrow,ncol),dtype ='double')
for i in range(nrow-1,-1,-1):
    if(i == nrow-1):
        center_y[i,:] = 0.5*deltay[nrow-1]
    else:
        center_y[i,:] = center_y[i+1,:] + 0.5*deltay[i+1] + 0.5*deltay[i]

for j in range(0,ncol):
    if(j ==0):
        center_x[:,j] = 0.5*deltax[0]
    else:
        center_x[:,j]= center_x[0,j-1] + 0.5*deltax[j-1] + 0.5*deltax[j]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-11 16:42:34

至少有两件事:

代码语言:javascript
复制
for i in range(nrow-1,-1,-1):
    if(i == nrow-1):
        center_y[i,:] = 0.5*deltay[nrow-1]
    else:
        center_y[i,:] = center_y[i+1,:] + 0.5*deltay[i+1] + 0.5*deltay[i]

可以更改以避免分支:

代码语言:javascript
复制
center_y[nrow-1,:] = 0.5*deltay[nrow-1]
for i in range(nrow-2,-1,-1):
    center_y[i,:] = center_y[i+1,:] + 0.5*deltay[i+1] + 0.5*deltay[i]

这更能利用numpy的优势:

代码语言:javascript
复制
center_y[nrow-1,:] = 0.5*deltay[nrow-1]
center_y[:nrow-1, :] = 0.5*deltay[1:] + 0.5*deltay[:nrow-1]
# expl: deltay[i+1] in the loop skips the first element, deltay[i] skips the last element
for i in range(nrow-2,-1,-1): # can't move this part since center_y[i,:] depends on center_y[i+1,:] 
    center_y[i,:] = center_y[i+1,:] 
票数 1
EN

Stack Overflow用户

发布于 2014-07-11 16:22:17

代码语言:javascript
复制
center_x[:,j]= center_x[0,j-1] + 0.5*deltax[j-1] + 0.5*deltax[j]
...
center_y[i,:] = center_y[i+1,:] + 0.5*deltay[i+1] + 0.5*deltay[i]

你必须分配给[:,j][i,:],而不仅仅是[i][j]吗?这类似于(但并不是因为有多个维度),而是将其提高到O(n^2)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24701882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档