如何优化处理数百万行的用户定义的python函数?

时间:2017-12-09 09:37:40

标签: python dictionary

我正在使用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方法,而不是直接在我的数据库中修改它,这将节省我的代码运行时间?

2 个答案:

答案 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操作上