Python 比较数组为零比 np.any(array) 更快

标签 python arrays numpy boolean

我想测试一个数组的所有元素是否都为零。根据 StackOverflow 帖子 Test if numpy array contains only zeroshttps://stackoverflow.com/a/72976775/5269892 ,与 (array == 0).all() 相比,not array.any() 应该是内存效率最高且速度最快的方法。

我用一个随机数 float 数组测试了性能,见下文。不知何故,至少对于给定的数组大小,not array.any() 甚至将数组转换为 boolean 类型似乎比 (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)

最佳答案

问题是由于前两个操作是使用 SIMD 指令向量化的,而后三个不是。更具体地说,最后三个调用对尚未矢量化的 bool (_aligned_contig_cast_double_to_bool) 进行隐式转换。这是一个已知问题,我已经提出了 pull request for this (由于现在修复了未定义的行为,这揭示了一些意想不到的问题)。如果一切正常,它将在 Numpy 的下一个主要版本中可用。

请注意 a.any()not a.any() 隐式地执行一个 boolean 数组的转换,然后执行 any 运行速度更快。这不是很有效,但这样做是为了减少生成的函数变体的数量(Numpy 是用 C 编写的,因此必须为每种类型生成不同的实现,并且很难优化许多变体,所以我们更喜欢这样执行这里隐式转换,更不用说这也减少了生成的二进制文件的大小)。如果这还不够,您可以使用 Cython 来生成更快的特定优化代码。

关于Python 比较数组为零比 np.any(array) 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72990372/

相关文章:

python - 使用 eq_ 和 Nose 测试,有没有办法知道两个字符串的哪一行和哪一行不同?

java - 对二维数组中的对象使用方法

arrays - 通过比较数组进行ElasticSearch 5.1过滤

python - 如何在python中合并多个数组?

numpy - 如果我使用python pandas,是否需要结构化数组?

python - 如何使用 Fabric 使其并行运行?

python - 优化 App Engine 上的 RSS 解析以避免高 CPU 警告

python - 在Python中对对象应用函数

java - 奥运会java编码

python - 数据装箱 : irregular polygons to regular mesh