pandas替换/字典缓慢
请帮助我了解为什么此“从字典替换”操作在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倍。
-
看起来
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