【发布时间】:2017-04-13 18:28:56
【问题描述】:
我想知道是否有一种更有效的方法可以在键存在时附加 dict 值,或者如果不存在则创建一个。目前,我使用“if key in set(dict.keys())”
我读了很多关于collections.defaultdict但它有效的话题吗?我的意思是,当您使用collections.defaultdict 时,python 是制作“if key in ...”还是工作方式不同?
我的问题是我的字典越来越大,所以我的if key in set(dict.keys()) 每次执行的时间都越来越长
这是我所说的一个例子:
# a_list is a result of a loop that can iterate more than 10, 100, 1000...times
a_list = [[url1, sessions, transactions], [url2, sessions, transactions]...]
mydict = {}
for i in a_list:
# if my key doesn't exist
if i[0] not in set(mydict.keys()):
mydict[i[0]] = {}
mydict[i[0]]['session'] = i[1]
mydict[i[0]]['transactions'] = i[2]
else:
# if my key exists
mydict[i0]['sessions'] += i[1]
mydict[i0]['transactions'] += i[2]
更准确地说,这个脚本是用来处理 Google Analytics API 的,以避免采样(所以我每个月的每一天都发出请求,所以我的 url(mydict 键)很有可能是相同的我每天都要求。
【问题讨论】:
-
如果您知道
if key in set(dict.keys())并且您很有可能每个请求的密钥都相同,您可以尝试“缓存”您确定存在的密钥(仅缓存最后一个密钥或缓存最后几个键),如果缓存了键,则不要在大字典中检查它,如果 mydict 真的很大,它可能会稍微提高性能。 -
是的,
defaultdict会快得多。此外,if i[0] not in set(mydict.keys())非常浪费。一个dict已经是一个hashmap,成员资格测试是一个常数时间的操作,检查一个key是否不存在应该由if i[0] not in mydict简单地完成。 -
“我使用“if key in set(dict.keys())” - 为什么?
if key in dict是O(1),如果你每次都建立一个集合那是O(n)! -
您可以使用
mydict.has_key而不是在每次迭代时创建密钥集。 -
@thedude 更习惯使用
key in my_dict和my_dict.has_key甚至在 Python 3 中都不再使用了,所以最好不要使用它。
标签: python dictionary