这是一个有趣的观察结果:
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指出的那样,迭代并非价值比较非常昂贵。但我确实需要通过数组进行迭代。还有比把它转换成列表更好的方法吗?
答案 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
表达式逐个元素地执行比较。您无需迭代执行该操作。