猿问

是否有一种快速方法可以使用特定值更新嵌套字典中的一组键?

我有一个帮助字典,其中键是事件对和特征的嵌套元组,特征的数量可以在 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约为 12 000 个按键。


该列表的大小all_keys_to_update约为 10 000。


嵌套的 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}

      

是否有更快的方法来更新嵌套字典中具有相同值的一组键?


白板的微信
浏览 105回答 1
1回答

慕的地10843

通过减少索引数量,您可以节省大约 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 pairfor (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', ''))] 
随时随地看视频慕课网APP
我要回答