熊猫比Numpy慢得多



下面的代码表明,pandas 可能比 numpy 慢得多,至少在函数 clip() 的特定情况下是这样。令人惊讶的是,从熊猫到熊猫再往返熊猫,同时在 numpy 中执行计算,仍然比在大熊猫中做要快得多。

熊猫功能不应该以这种迂回的方式实现吗?

In [49]: arr = np.random.randn(1000, 1000)
In [50]: df=pd.DataFrame(arr)
In [51]: %timeit np.clip(arr, 0, None)
100 loops, best of 3: 8.18 ms per loop
In [52]: %timeit df.clip_lower(0)
1 loops, best of 3: 344 ms per loop
In [53]: %timeit pd.DataFrame(np.clip(df.values, 0, None))
100 loops, best of 3: 8.4 ms per loop

在 master/0.13(即将发布)中,这要快得多(由于处理对齐/dtype/nans,仍然比本机 numpy 稍慢)。

在 0.12 中,它是按列应用的,因此这是一个相对昂贵的操作。

In [4]: arr = np.random.randn(1000, 1000)
In [5]: df=pd.DataFrame(arr)
In [6]: %timeit np.clip(arr, 0, None)
100 loops, best of 3: 6.62 ms per loop
In [7]: %timeit df.clip_lower(0)
100 loops, best of 3: 12.9 ms per loop

在我的基准测试中,np.maximum 是最快的,无论是在df还是numpy.array运行。

arr = np.random.randn(1000, 1000)
df = pd.DataFrame(arr)
%%timeit
np.clip(arr, 0, None)
# 4.55 ms ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
df.clip(lower=0.0)
# 5.62 ms ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
np.maximum(arr, 0)
# 4.53 ms ± 9.23 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
np.maximum(df, 0)
# 4.65 ms ± 5.13 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

最新更新