pandas 比 numpy 慢得多?

Posted

技术标签:

【中文标题】pandas 比 numpy 慢得多?【英文标题】:pandas much slower than numpy? 【发布时间】:2013-11-07 10:54:38 【问题描述】:

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

pandas功能不应该是这样实现的吗?

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

【问题讨论】:

没关系,因为 pandas 在剪辑的基础上进行了大量的数据检查、转换和其他工作 当@alko 列举的时候,我也很意外地发现头顶上的所有熊猫。索引是使 pandas 与 numpy 不同的另一个现实。查看Sofia Heisler No More Sad Pandas Optimizing Pandas Code for Speed and Efficiency PyCon 2017 的谈话,了解 pandas 开销的一些评论和后果以及一堆丰富的比较,而不是所有 numpy 与 pandas。但是,引入.values 的示例进行了直接比较。 【参考方案1】:

在 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

【讨论】:

【参考方案2】:

在我的基准测试中,np.maximum 是最快的,在 dfnumpy.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)

【讨论】:

以上是关于pandas 比 numpy 慢得多?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在迭代 NumPy 数组时 Cython 比 Numba 慢得多?

为啥 TensorFlow matmul() 比 NumPy multiply() 慢得多?

Numpy 排序比 Matlab 排序慢得多

Pandas groupby 应用执行缓慢

为啥 Numpy 和 Pandas 数组比源数据消耗更多内存? [关闭]

为啥 aiohttp 比 gevent 慢得多?