作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
1.考虑以下对numpy.ndarray的遍历
for ii in xrange(0,(nxTes-2)):
if ( (xCom-dtaCri-xcTes[ii]) * (xCom-dtaCri-xcTes[ii+1]) ) <= 0.0:
nxL=ii
if ( (xCom+dtaCri-xcTes[ii]) * (xCom+dtaCri-xcTes[ii+1]) ) <= 0.0:
nxR=ii+1
2. xCom
、dtaCri
和 xcTes
的类型为() numpy.float64<分别为/strong>、float 和 numpy.ndarray
3. 对于 nyTes
和 nzTes
重复上面的完整 block ,即在主算法循环中总共完成了三个 block 。目标是使用来自 xcTes
dtaCri
且中心位于比较点 xCom
的感兴趣区域4. 上面的代码或多或少是从 Matlab 直接移植的,其中相同的 block 以大约三到四倍的速度执行。
<强>5。问题:是否可以在执行时间方面优化上面的 block ,如果可以,如何优化?
6. 到目前为止,我已经尝试了一些小的调整,例如更改数据类型和使用 range() 而不是 xrange()我没有看到性能有明显变化。
最佳答案
在以矢量化方式进入循环并使用切片之前预先计算这些 bool 条件输出,这只是输入数组的 View ,就像这样 -
parte1 = ( (xCom-dtaCri-xcTes[:nxTes-2]) * (xCom-dtaCri-xcTes[1:nxTes-1]) ) <=0.0
parte2 = ( (xCom+dtaCri-xcTes[:nxTes-2]) * (xCom+dtaCri-xcTes[1:nxTes-1]) ) <=0.0
我们可以看到很少有重复的计算。所以,我们可以在那里进行一些重用 -
p = xCom-xcTes[:nxTes-1]
p0 = p - dtaCri
p1 = p + dtaCri
parte1 = p0[:-1]*p0[1:] <= 0.0
parte2 = p1[:-1]*p1[1:] <= 0.0
然后,只需在循环中使用这些 bool 值 -
for ii in xrange(0,(nxTes-2)):
if parte1[ii]:
nxL=ii
if parte2[ii]:
nxR=ii+1
这个想法是在循环内做最少的工作,重点关注性能。
我假设您在使用 nxL
和 nxR
的循环中还有更多工作要做,因为否则我们会将值覆盖到这两个变量中。
关于python - numpy数组遍历的优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41271695/
我是一名优秀的程序员,十分优秀!