numpy中的ndarry:在ndarray迭代中很昂贵

时间:2016-12-18 16:42:53

标签: python performance numpy

这是一个有趣的观察结果:

1 import numpy as np
2 data = np.array([[255,255,255], [0, 0, 255], [255, 0, 0]], np.int8)
3 for i in range(1000000):
4    for row in data:
5        for col in row:
6            flag = col > 0

以上代码需要 ~17秒才能完成。如果我通过执行

data转换为列表
data = data.tolist()

然后整个事情只需要< 1秒完成。

想知道: 1. ndarray价值比较效率低的原因是什么? 2.如果我没有将ndarray转换为列表,那么进行比较的更合适的方法是什么?它会比我把它转换成列表更有效吗?

谢谢!

--------------编辑问题:-------------

正如@hpaulj指出的那样,迭代并非价值比较非常昂贵。但我确实需要通过数组进行迭代。还有比把它转换成列表更好的方法吗?

2 个答案:

答案 0 :(得分:1)

更合适和有效的方法是使用numpy元素比较。

for i in range(1000000):
    flag = data > 0

答案 1 :(得分:0)

从侧栏:Why is a `for` over a Python list faster than over a Numpy array?

如何更快地对数组进行迭代的问题经常出现 - 最好的答案是“不要”,或者更确切地说,将迭代推送到编译的numpy代码上。没有办法在Python级别显着更快地进行显式迭代。一些技巧可能会产生2倍的加速,但不是一个数量级。

所以在你的情况下,答案是it depends on what you are doing at each iteration。正如gzc's答案所示,您可以使用一个numpy表达式逐个元素地执行比较。您无需迭代执行该操作。