我有一个帮助字典,其中的键是事件对和功能的嵌套元组,功能的数量可以在1-N之间。该值是所述事件对和功能的支持。
我有一个字典d
,它是一个嵌套字典,其中将存储每个事件对的支持以及该功能的每个可能的部分重复。
这是在以下代码段中完成的
help_d = {(('Event 1', 'Event 2'),('Feature A', 'Feature B',...,'Feature T', 'Feature H')) : 10,
(('Event 1', 'Event 3'),('Feature C', 'Feature E',...,'Feature H', 'Feature G')) : 50,
(('Event 1', 'Event 4'),('Feature F', 'Feature G',...,'Feature T', 'Feature X')) : 100,
.....
(('Event 10', 'Event 15'),('Feature D', 'Feature E',....,'Feature V', 'Feature B')) : 5}
d = defaultdict(int,defaultdict())
for key,value in help_d.items():
event_a = key[0][0]
event_b = key[0][1]
feature_tuple = key[1]
#Every possible partial duplicate of the features
all_keys_to_update = list(itertools.product(*zip(feature_tuple, itertools.repeat(''))))
#Nested for loop that takes around 3-4 secs per iteration
for key_to_update in all_keys_to_update:
d[(event_a,event_b)][key_to_update] += value
的大小help_dict
约为12000个密钥。
列表的大小all_keys_to_update
约为10000。
嵌套的for循环大约需要3-4秒,这意味着大约需要11个小时才能完成此特定代码段。
我只有3个事件和2个功能的示例
help_d = {(('Event 1', 'Event 2'),('Feature A', 'Feature B')) : 10,
(('Event 1', 'Event 2'),('Feature A', 'Feature C')) : 20,
(('Event 1', 'Event 3'),('Feature D', 'Feature C')) : 50,
(('Event 2', 'Event 3'),('Feature D', 'Feature B')) : 10}
这将导致以下字典 d
d = {('Event 1','Event 2'): {('','') : 30,
('A','') : 30,
('','B') : 10,
('','C') : 20,
('A','B') : 10,
('A','C') : 20},
('Event 1','Event 3'): {('','') : 50,
('D','') : 50,
('','C') : 50,
('D','C') : 50},
('Event 2','Event 3'): {('','') : 10,
('D','') : 10,
('','B') : 10,
('D','B') : 10}}
有没有更快的方法来更新嵌套字典中具有相同值的一组键?
通过减少索引的数量,您可以节省大约30%的时间(取决于数据),但是鉴于生成的组合数量之多,我看不出如何使速度更快:
d = defaultdict(lambda:defaultdict(int))
for (events,features),count in help_d.items():
counts = d[events]
for combo in product(*zip(features, repeat(''))):
counts[combo] += count
但是,取决于以后使用此词典的方式,仅在使用时生成计数可能会更有效。您可以通过创建为给定事件和功能组合实现“按需”计算的类或函数来实现。
help_events = defaultdict(list) # list of feature patterns for each event pair
for (event,features),count in help_d.items():
help_events[event].append(features)
help_cache = dict() # cached results
def getFeatureCount(events,pattern):
# check cache first
if (events,pattern) in help_cache:
return help_cache[(events,pattern)]
# compute total of matching feature patterns
result = 0
for eventFeatures in help_events[events]:
if all(e==f or f=="" for e,f in zip(eventFeatures,pattern)):
result += help_d[(events,eventFeatures)]
#save to cache and return result
help_cache[(events,pattern)] = result
return result
用法:
getFeatureCount(('Event 1', 'Event 2'),('Feature A', '')) # --> 30
# wich is equivalent to d[(('Event 1', 'Event 2'),('Feature A', ''))]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句