为什么"any"有时比 python 中布尔值的"max"工作得更快,有时甚至慢得多?



考虑以下代码:

import numpy as np
import pandas as pd
a = pd.DataFrame({'case': np.arange(10000) % 100,
                  'x': np.random.rand(10000) > 0.5})
%timeit any(a.x)
%timeit a.x.max()
%timeit a.groupby('case').x.transform(any)
%timeit a.groupby('case').x.transform(max)
13.2 µs ± 179 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
195 µs ± 811 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
25.9 ms ± 555 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
1.43 ms ± 13.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
b = pd.DataFrame({'x': np.random.rand(100) > 0.5})
%timeit any(b.x)
%timeit b.x.max()
13.1 µs ± 205 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
81.5 µs ± 1.81 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

我们看到,"任何"的工作速度比布尔熊猫的" max"更快。"任何"。为什么?

因为any评估是懒惰的。这意味着any函数将停止在第一个True布尔元素。

max不能这样做,因为它需要在序列中检查每个元素,以确保它没有错过任何更大的元素。

这就是为什么,当any在第一个True之前仅检查元素时,max总是会检查所有元素。

max工作速度更快的情况可能是具有类型胁迫的情况,因为Numpy中的所有值都以自己的类型和格式存储,数学操作可能比Python的any更快。

如评论中所述,python any fonction具有短路机制,当np.any时没有。请参阅此处。

但是True in a.x甚至更快:

 %timeit any(a.x)
53.6 µs ± 543 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit True in (a.x)
3.39 µs ± 31.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

最新更新