我正在使用python 3.6。 我的Python代码是从数据库中检索数据,处理数据并以csv格式保存结果。处理完毕后,我的行数大约为8000万。
处理数据的一个字段是字典的值,该字段包含针对密钥的多个值;所以在处理过程中,该字段的值以列表格式存储在数据帧列中。
我需要用相应的字典键替换该值。所以我编写了以下函数将值转换为字典键:
def keysWithValue(aDict, target):
return sorted(key for key, value in aDict.items() if target == value)
我觉得如果我将为这8000万条记录使用for
循环并在每条记录上调用此函数,则需要花费大量时间。你能否建议我一些替代的Python方法,而不是直接在我的数据库中修改它,这将节省我的代码运行时间?
答案 0 :(得分:0)
您可以为该字段创建反向查找字典:
from collections import defaultdict
def makeInverseLookupDict(aDict):
reverseDict = defaultdict(list)
for key, value in aDict.iteritems():
reverseDict[value].append(key)
return reverseDict
找到具有给定值的键现在是O(1)。这将占用与原始字典一样多的空间,但将是即时的。
答案 1 :(得分:0)
您获得的最快速度是反转键和值以创建值:键查找映射:
rev_dict = {v: k for k, v in aDict.items()} # use aDict.iteritems() on Python 2.x
更新 - 如果密钥和值之间没有1对1的关系,而您有多个值,则可以将它们解压缩为:
rev_dict = {i: k for k, v in aDict.items() for i in v} # use aDict.iteritems() on Python 2.x
然后在您的代码中,当您从数据库中检索数据时,只需通过查看该查找映射来获取列值:
column_value = rev_dict.get(column_value, column_value)
如果column_value
中存在aDict
,或者将其自身的值保持不变,那将为您提供密钥。
请记住,如果您的aDict
不是太大,而您的方法有点浪费,大部分时间来处理这些80M行仍将花费在I / O操作上