为什么熊猫的索引这么慢?如何使其更快?

时间:2019-01-01 17:17:46

标签: python pandas

运行此代码显示了熊猫和常规python列表之间的速度差异:

url(r'^password-reset/done/',...)

结果(10个索引随机元素的试验10万次):

ser = pd.Series(range(100))
lst = ser.tolist()

for _ in range(10):
    pandas_time = 0
    list_time = 0
    for _ in range(100000):
        r = randint(0, len(ser)-1)
        t = time()
        ser[r]
        pandas_time += time() - t

        t = time()
        lst[r]
        list_time += time() - t

    print(pandas_time, list_time)

索引熊猫系列似乎比python列表慢30-100倍。为什么?我们如何加快速度?

2 个答案:

答案 0 :(得分:2)

我检查了Pandas Regular List 0.6404812335968018 0.03125190734863281 0.6560468673706055 0.0 0.5779874324798584 0.01562190055847168 0.5467743873596191 0.015621662139892578 0.6106545925140381 0.004016399383544922 0.5866603851318359 0.029597759246826172 0.7981059551239014 0.016004562377929688 0.8128316402435303 0.013040542602539062 0.5566465854644775 0.021578073501586914 0.6386256217956543 0.00500178337097168 源代码。与常规python列表相比,pandas系列中的pandas'实现具有许多其他业务逻辑,因为pandas系列支持使用列表和可迭代对象建立索引。

索引熊猫系列时:

  1. 尝试调用可调用的密钥

  2. 获取该键处的索引值(听起来很简单,但请记住,索引是另一个熊猫对象,它还必须支持常规索引以外的工作)

  3. 检查2)是否为标量

  4. 如果是标量,则返回结果

与常规的python列表相比,这些额外的步骤大大降低了__getitem__的速度。

要解决此问题,您可以直接使用基础的numpy数组。在这里,我们使用__getitem__来索引:

ser.values

在索引1000000个随机元素10次之后,我们发现使用ser = pd.Series(range(100)) lst = ser.tolist() ser = ser.values for _ in range(10): pandas_time = 0 list_time = 0 for _ in range(1000000): r = randint(0, len(ser)-1) t = time() ser[r] pandas_time += time() - t t = time() lst[r] list_time += time() - t print(pandas_time, list_time) 比仅索引熊猫系列要快得多,但仍比使用python列表慢

.values

使用pd.Series.values Regular List 0.18845057487487793 0.04786252975463867 0.10950899124145508 0.11034011840820312 0.048889875411987305 0.09512066841125488 0.17272686958312988 0.1406867504119873 0.14252233505249023 0.048066139221191406 0.06352949142456055 0.07906699180603027 0.1405477523803711 0.07815265655517578 0.18746685981750488 0.08007645606994629 0.1405184268951416 0.0781564712524414 0.07921838760375977 0.1412496566772461 进行汇总是您需要快速索引熊猫系列的一种方法。尽管.values看起来更快,但是请记住,索引各个元素时它只会稍微快一点。 Numpy数组将支持更快的花式索引编制,例如具有多个元素的索引编制。

答案 1 :(得分:0)

pandas 对 index 和 reindex 的实现质量很低。 它包含太多的开销。

有关进一步讨论,请参阅以下链接。 https://github.com/pandas-dev/pandas/issues/23735