pandas替换/字典缓慢

发布于 2021-01-29 17:21:28

请帮助我了解为什么此“从字典替换”操作在Python / Pandas中运行缓慢:

# Series has 200 rows and 1 column
# Dictionary has 11269 key-value pairs
series.replace(dictionary, inplace=True)

字典查找应为O(1)。替换列中的值应为O(1)。这不是向量化操作吗?即使不进行向量化,迭代200行也仅进行200次迭代,那么它怎么会慢呢?

这是SSCCE演示的问题:

import pandas as pd
import random

# Initialize dummy data
dictionary = {}
orig = []
for x in range(11270):
    dictionary[x] = 'Some string ' + str(x)
for x in range(200):
    orig.append(random.randint(1, 11269))
series = pd.Series(orig)

# The actual operation we care about
print('Starting...')
series.replace(dictionary, inplace=True)
print('Done.')

在我的机器上运行该命令需要1秒钟以上的时间,比执行<1000次操作的预期时间长1000倍。

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    看起来replace有些开销,并且明确地告诉该系列该怎么做才能map产生最佳性能:

    series = series.map(lambda x: dictionary.get(x,x))
    

    如果您确定所有键都在字典中,则可以通过不创建lambda并直接提供该dictionary.get函数来稍微提高性能。任何不存在的密钥将NaN通过此方法返回,因此请注意:

    series = series.map(dictionary.get)
    

    您也可以只提供字典本身,但这似乎会带来一些开销:

    series = series.map(dictionary)
    

    时机

    使用示例数据进行一些时序比较:

    %timeit series.map(dictionary.get)
    10000 loops, best of 3: 124 µs per loop
    
    %timeit series.map(lambda x: dictionary.get(x,x))
    10000 loops, best of 3: 150 µs per loop
    
    %timeit series.map(dictionary)
    100 loops, best of 3: 5.45 ms per loop
    
    %timeit series.replace(dictionary)
    1 loop, best of 3: 1.23 s per loop
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看