为啥 pd.unique() 比 np.unique() 快?

Posted

技术标签:

【中文标题】为啥 pd.unique() 比 np.unique() 快?【英文标题】:Why is pd.unique() faster than np.unique()?为什么 pd.unique() 比 np.unique() 快? 【发布时间】:2019-04-18 00:43:18 【问题描述】:

我试着比较了两个,一个是pandas.unique(),另一个是numpy.unique(),我发现后者实际上超过了第一个。 我不确定阁下是不是线性的。

关于代码实现,谁能告诉我为什么存在这样的差异?在什么情况下我应该使用哪个?

【问题讨论】:

没有直接的答案——从来没有深入挖掘过,但 Pandas 在文档本身中称其为.unique() 的速度。 pandas.pydata.org/pandas-docs/version/0.23.4/generated/… unique 没有特别使用 numpy 多维性。这是一种与求和和乘法截然不同的运算。它对一维数组进行排序,然后查找相邻的重复项。 np.lib.arraysetops._unique1d 此外,np.unique 比 pandas 独特的功能要多得多。比如返回找到它们的位置的索引、重建原始数组的能力以及找到的唯一值的计数。 @hpaulj - 根据@dozyaustin 指出的文档,pandas unique() 的速度与排序无关(这将需要大量额外的内存和时间;关于访问第一个独特的元素)。相反,该操作使用 hashmap 来跟踪迭代器在其过程中通过数据帧访问过的元素。 【参考方案1】:

np.unique() 将数据视为一个数组,因此它单独遍历每个值,然后识别唯一字段。

然而,pandas 具有包含此信息的预构建元数据,而 pd.unique() 只是调用包含“唯一”信息的元数据,因此不必再次计算它。

【讨论】:

以上是关于为啥 pd.unique() 比 np.unique() 快?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 removeChild 比 innerHTML = ' ' 快?

为啥回调比承诺更“紧密耦合”?

为啥`[`比`subset`好?

为啥类型参数比方法参数强

为啥 python gevent 比串行慢?

为啥字典比列表快得多?