python向量化和c哪个快_我可以向量化此Python代码吗? - python

我是Python的新手,我必须实现此代码的“尽可能快”的版本。

s="

z=struct.unpack(s, contents)

heights = np.zeros((height,width))

for r in range(0,height):

for c in range(0,width):

elevation=z[((width)*r)+c]

if (elevation==65535 or elevation<0 or elevation>20000):

elevation=0.0

heights[r][c]=float(elevation)

我已经阅读了一些python向量化问题...但是我认为这不适用于我的情况。大多数问题是使用np.sum而不是for loops之类的问题。我想我有两个问题:

是否有可能加快此代码的速度...我认为heights[r][c]=float(elevation)是瓶颈所在。我需要找到一些Python计时命令来确认这一点。

如果可以加快此代码的速度。我有什么选择?我见过有人推荐cython,pypy,weave。我可以在C语言中更快地执行此操作,但是此代码还需要生成图,因此我想坚持使用Python,以便可以使用matplotlib。

python大神给出的解决方案

如您所述,使用numpy编写快速代码的关键涉及向量化,并将工作推向快速C级例程而不是Python循环。相对于原始代码,通常的方法似乎可以使性能提高十倍左右:

def faster(elevation, height, width):

heights = np.array(elevation, dtype=float)

heights = heights.reshape((height, width))

heights[(heights < 0) | (heights > 20000)] = 0

return heights

>>> h,w = 100, 101; z = list(range(h*w))

>>> %timeit orig(z,h,w)

100 loops, best of 3: 9.71 ms per loop

>>> %timeit faster(z,h,w)

1000 loops, best of 3: 641 µs per loop

>>> np.allclose(orig(z,h,w), faster(z,h,w))

True

该比例似乎甚至更长的时间都保持不变:

>>> h,w = 1000, 10001; z = list(range(h*w))

>>> %timeit orig(z,h,w)

1 loops, best of 3: 9.44 s per loop

>>> %timeit faster(z,h,w)

1 loops, best of 3: 675 ms per loop


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部