gpt4 book ai didi

python - Pandas 替换/字典缓慢

转载 作者:太空狗 更新时间:2023-10-30 00:29:13 25 4
gpt4 key购买 nike

请帮助我理解为什么这个“从字典替换”操作在 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

关于python - Pandas 替换/字典缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41985566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com