【问题标题】:Is there a performance difference between Numpy and Pandas?Numpy 和 Pandas 之间有性能差异吗?
【发布时间】:2014-03-01 07:53:22
【问题描述】:

假设我将使用 Numpy 数组,我编写了一堆代码。原来我得到的数据是通过熊猫加载的。我现在记得我在 Pandas 中加载了它,因为我在 Numpy 中加载它时遇到了一些问题。我认为数据太大了。

因此我想知道,使用 Numpy 和 Pandas 时计算能力是否存在差异?

如果 Pandas 更高效,那么我宁愿为 Pandas 重写我的所有代码,但如果没有更高的效率,那么我将只使用一个 numpy 数组...

【问题讨论】:

  • 这可能是一个太宽泛的问题,没有用处。 pandas 提供了一堆 C 或 Cython 优化的例程,这些例程可以比 numpy “等效”(例如阅读文本)更快。对于点积之类的东西,pandas DataFrames 通常会比 numpy 数组慢,因为 pandas 正在做更多的事情对齐标签,可能处理异构类型等等。
  • @TomAugspurger 嗯,好吧...有没有什么地方可以让我了解它的优势与优化程度较低的地方?
  • 我不确定它的单一来源。我可以油嘴滑舌地说自己做:)。分析可能非常重要。 This 不会直接回答您的问题,但无论如何可能会有用。
  • 有什么区别?容量差异、性能差异(内存/CPU/并行度/两者?)、算法差异、精度差异(浮点数与双精度、整数与 int64)、行优先与列优先……?请添加细节。

标签: python numpy pandas


【解决方案1】:

可能存在显着的性能差异,乘法的数量级和索引几个随机值的多个数量级。

我其实也想知道同样的事情,并遇到了这个有趣的比较: http://penandpants.com/2014/09/05/performance-of-pandas-series-vs-numpy-arrays/

【讨论】:

  • 该链接仅针对 pandas 系列与 numpy 数组,但他们的发现是否也适用于填充二维 numpy 数组与 pandas 数据帧?
【解决方案2】:

我认为这更多是关于战略性地使用这两者并根据您看到的性能转移数据(从 numpy 到 pandas 或反之亦然)。作为最近的示例,我尝试使用 numpy 连接 4 个小泡菜文件,每个文件有 10k 行 data.shape -> (10,000, 4)。

代码类似于:

n_concat = np.empty((0,4))
for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(file_path)
    n_concat = np.vstack((co_np, filtered_snp))
joblib.dump(co_np, 'data/save_file.pkl', compress = True)

这让我的笔记本电脑(8 GB,i5)崩溃了,这很令人惊讶,因为它的体积并不是真的那么很大。 4 个压缩的腌制文件每个大约 5 MB。

同样的事情,在 pandas 上效果很好。

for file_path in glob.glob('data/0*', recursive=False):
    n_data = joblib.load(sd)
    try:
        df = pd.concat([df, pd.DataFrame(n_data, columns = [...])])
    except NameError:
        df = pd.concat([pd.DataFrame(n_data,columns = [...])])
joblib.dump(df, 'data/save_file.pkl', compress = True)

另一方面,当我通过迭代 pandas 数据帧来实现梯度下降时,它非常慢,而使用 numpy 来完成这项工作要快得多。

一般来说,我发现 pandas 通常更适合移动/处理中等大小的数据块和执行常见的列操作,而 numpy 最适合在较小的集合上进行矢量化和递归工作(可能是更多数学密集型工作)数据。

在两者之间移动数据很容易,所以我想,战略性地使用两者是要走的路。

【讨论】:

    【解决方案3】:

    在我对大型数值数据的实验中,Pandas 始终比 Numpy 慢 20 倍。这是一个巨大的差异,因为只执行了简单的算术运算:列的切片、mean()、searchsorted() - 见下文。最初,我认为 Pandas 是基于 numpy 的,或者至少它的实现是 C 优化的,就像 numpy 的一样。然而,考虑到巨大的性能差距,这些假设被证明是错误的。

    在下面的示例中,data 是一个具有 8M 行和 3 列(int32、float32、float32)的 pandas 框架,没有 NaN 值,列 #0(时间)已排序。 data_np 被创建为 data.values.astype('float32')。 Python 3.8、Ubuntu 上的结果:

    A.列切片和mean():

    # Pandas 
    %%timeit 
    x = data.x 
    for k in range(100): x[100000:100001+k*100].mean() 
    
    15.8 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    # Numpy
    %%timeit 
    for k in range(100): data_np[100000:100001+k*100,1].mean() 
    
    874 µs ± 4.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    

    Pandas 比 Numpy 慢 18 倍(15.8 毫秒对 0.874 毫秒)。

    B.在排好序的列中搜索:

    # Pandas
    %timeit data.time.searchsorted(1492474643)                                                                                                                                                               
    20.4 µs ± 920 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    # Numpy
    %timeit data_np[0].searchsorted(1492474643)                                                                                                                                                              
    1.03 µs ± 3.55 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    

    Pandas 比 Numpy 慢 20 倍(20.4µs vs 1.03µs)。

    编辑: 我实现了一个 namedarray 类,它在 Pandas 和 Numpy 之间架起了一座桥梁,因为它基于 Numpy 的 ndarray 类,因此性能比 Pandas 好(通常快 7 倍)并且完全兼容使用 Numpy'a API 及其所有运算符;但同时它保留了类似于 Pandas 的 DataFrame 的列名,因此对单个列的操作更容易。这是一个原型实现。与 Pandas 不同,namedarray 确实 not 允许列的不同数据类型。代码可以在这里找到:https://github.com/mwojnars/nifty/blob/master/math.py(搜索“namedarray”)。

    【讨论】:

    • 什么是“大数字数据”百万?数十万?谢谢你:)
    • 我对 1-10M 行数据进行了比较,多列,就像上面的例子一样。
    • 这是一个很好的比较,但我认为至少可以说是不完整的。如果我们有 200 列(常见用例),然后我们对其进行切片呢?显然,这些列不会是形状为 (200, ...) 的 numpy 矩阵,而是 200 个变量,它们组合在一个 Python 对象中。我非常希望看到这种比较
    • 另外转换成numpy进行计算的成本呢?
    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2015-01-17
    • 2010-10-25
    • 2014-02-05
    • 2018-09-09
    相关资源
    最近更新 更多