当前位置: 首页 > 面试题库 >

非唯一索引对熊猫的性能有何影响?

荀正谊
2023-03-14
问题内容

从pandas文档中,我收集到,唯一值索引使某些操作高效,并且偶尔可以容忍非唯一索引。

从外部看,看起来非唯一索引没有以任何方式被利用。例如,以下ix查询足够慢,以至于似乎正在扫描整个数据帧

In [23]: import numpy as np
In [24]: import pandas as pd
In [25]: x = np.random.randint(0, 10**7, 10**7)
In [26]: df1 = pd.DataFrame({'x':x})
In [27]: df2 = df1.set_index('x', drop=False)
In [28]: %timeit df2.ix[0]
1 loops, best of 3: 402 ms per loop
In [29]: %timeit df1.ix[0]
10000 loops, best of 3: 123 us per loop

(我意识到这两个ix查询不会返回相同的内容,这只是一个ix对非唯一索引的调用要慢得多的示例)

有什么办法哄骗大熊猫使用更快的查找方法,例如对非唯一索引和/或排序索引进行二进制搜索?


问题答案:

当索引是唯一的时,熊猫使用哈希表将键映射到值O(1)。当索引不是唯一且排序时,大熊猫使用二进制搜索O(logN),当索引为随机排序时,大熊猫需要检查索引O(N)中的所有键。

您可以调用sort_index方法

import numpy as np
import pandas as pd
x = np.random.randint(0, 200, 10**6)
df1 = pd.DataFrame({'x':x})
df2 = df1.set_index('x', drop=False)
df3 = df2.sort_index()
%timeit df1.loc[100]
%timeit df2.loc[100]
%timeit df3.loc[100]

结果:

10000 loops, best of 3: 71.2 µs per loop
10 loops, best of 3: 38.9 ms per loop
10000 loops, best of 3: 134 µs per loop


 类似资料:
  • 我知道如果数据是唯一的,理论上唯一索引会比非唯一索引快。 因为唯一索引能够提供更多信息,并让查询优化器选择更有效的执行计划。 我正在做一些测试,想证明唯一索引可能比执行计划中的非唯一索引更好,但结果显示它们是相同的。。。 我创建了一个表和两个索引(< code>IX_ID_T3不唯一,< code>UIX_ID_T3唯一),然后插入了1000000个样本行。 插入数据后,我运行< code >真空

  • 问题内容: 就性能而言,MySQL唯一索引和非唯一索引有什么区别? 假设我要在2列的组合上创建索引,并且该组合是唯一的,但是我创建了一个非唯一的索引。这会对MySQL使用的性能或内存产生重大影响吗? 同样的问题, 主 键和 唯一 索引之间有区别吗? 问题答案: UNIQUE和PRIMARY KEY是 约束 ,而不是索引。尽管大多数数据库通过使用索引来实现这些约束。除了索引之外,约束的额外开销也微不

  • 问题内容: Pandas确实很棒,但令我惊讶的是,从Pandas.DataFrame检索值的效率低下。在下面的玩具示例中,即使DataFrame.iloc方法也比字典慢100倍以上。 问题:这里的教训仅仅是字典是查找价值的更好方法吗?是的,我知道那正是他们的目的。但是我只是想知道是否缺少有关DataFrame查找性能的信息。 我意识到这个问题比“提问”更“有趣”,但是我会接受一个提供洞察力或观点的

  • 问题内容: 在Pandas方法的文档中,我们具有: 我的结构如下: 我想要这样的东西: 但是当我运行该方法时,它是在说: 这没有意义,即使在示例中,该列上也有重复的条目。我将列用作数据透视表的索引,即方法调用的第一个参数。 问题答案: 对我来说还好吗?您可以发布正在使用的确切数据透视方法调用吗?

  • 问题内容: 不知道在PostgreSQL 9.3+中是否可行,但是我想在非唯一列上创建唯一索引。对于像这样的表: 我想仅能[快速]查询不同的日子。我知道我可以用来帮助执行不同的搜索,但是如果不同值的数量大大少于索引覆盖的行数,这似乎会增加额外的开销。就我而言,大约30天中有1天与众不同。 我是创建关系表以仅跟踪唯一条目的唯一选择吗?思维: 并在每次插入数据时使用触发器来更新它。 问题答案: 索引只

  • 问题内容: 因此,我了解到可以使用DataFrame.groupby而不用使用MultiIndex进行子采样/横截面。 另一方面,当我在DataFrame上具有MultiIndex时,仍然需要使用DataFrame.groupby进行子采样/横截面。 那么,除了在打印时非常有用和漂亮地显示层次结构之外,MultiIndex有什么好处? 问题答案: 在pandas 0.4版本中引入了分级索引(也称为