Есть ли способ ускорить python itertools.combination () для больших объемов данных? - PullRequest
0 голосов
/ 13 апреля 2020

Я недавно нашел itertools.combinations(), проблема в том, что у меня есть большое количество предметов для этой игры, 228, с комбинациями до 6. Это оставляет мне 182587922160 уникальных комбинаций. У меня есть функция фильтрации по статистике, которую я хочу увеличить, но у меня все еще остается 75 и 201359550 комбинаций.

В настоящее время я использую такую ​​функцию:

item_combinations = \
     list( filter( self.is_valid,
                   itertools.combinations( self.filter_items( self.player,
                                                              self.items
                                                              ),
                                           6
                                           )
                   )
           )
....
def filter_items(self, player, items):
    tier_3_items = filter_json(items, "tier", 3)
    items_by_type = filter_json(tier_3_items, "type", player["powerType"])
    return items_by_type

def is_valid(self, item_set):
    # stats is a dict structured like:
    #           { "mana": 0, "health": 0, "attackSpeed": 0, ... etc }
    # attribute_goals is structured the same but with values I'm trying to reach.
    stats = self.stats.copy()
    for item in item_set:
        for key in [x for x in item if x in stats]:
            stats[key] += item[key]
    if all(int(stats[x]) >= int(self.attribute_goals[x]) for x in stats):
        return True
    return False

А данные, с которыми я работаю, извлекаются из JSON -файла, структура которого выглядит следующим образом:

[ { 'name':            'Shuriken',
    'id':           1290,
    'type':            'Physical',
    'tier':            1,
    'childItemId':  1289,
    'attackSpeed':    10,
    'criticalChance': 10
     },
  {  etc ...,
     },
  ...
  ]

Есть ли лучший способ сделать это или любой другой способ ускорить генерацию комбинаций

...