提问人:bproxauf 提问时间:7/15/2022 更新时间:7/16/2022 访问量:302
Python 将数组与零比 np.any(array) 快
Python comparing array to zero faster than np.any(array)
问:
我想测试数组的所有元素是否都为零。根据 StackOverflow 帖子 测试 numpy 数组是否只包含零和 https://stackoverflow.com/a/72976775/5269892,与 相比,应该是内存效率最高且速度最快的方法。(array == 0).all()
not array.any()
我用随机数浮动数组测试了性能,见下文。不知何故,至少对于给定的数组大小,甚至将数组转换为布尔类型似乎也比 慢。怎么会这样?not array.any()
(array == 0).all()
np.random.seed(100)
a = np.random.rand(10418*144)
%timeit (a == 0)
%timeit (a == 0).all()
%timeit a.astype(bool)
%timeit a.any()
%timeit not a.any()
# 711 µs ± 192 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# 740 µs ± 1.38 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# 1.69 ms ± 587 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# 1.71 ms ± 1.31 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
# 1.71 ms ± 2.05 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
答:
2赞
Jérôme Richard
7/16/2022
#1
该问题是由于前两个操作使用 SIMD 指令进行矢量化,而后三个操作则不然。更具体地说,最后三个调用对尚未矢量化的 bool () 进行隐式转换。这是一个已知问题,我已经为此提出了一个拉取请求(由于未定义的行为,它揭示了一些意外问题,现在已经修复)。如果一切正常,它应该在 Numpy 的下一个主要版本中可用。_aligned_contig_cast_double_to_bool
请注意,并隐式地对布尔数组执行强制转换,以便更快地执行操作。这不是很有效,但这是这样做的,这样可以减少生成的函数变体的数量(Numpy 是用 C 语言编写的,因此必须为每种类型生成不同的实现,并且很难优化许多变体,因此我们更喜欢在这里执行隐式转换,更不用说这也减小了生成的二进制文件的大小)。如果这还不够,则不能使用 Cython 来生成更快的特定优化代码。a.any()
not a.any()
any
评论
a.sum()==0