Продолжая идею @ jake2389, вы можете сделать несколько трюков. То, что вы действительно можете сделать, во многом зависит от того, насколько велик ваш набор данных и сколько раз вы можете разместить его в своей памяти (или своей базе данных). Очевидный способ улучшить производительность - это сделать кеширование. Предположим, у вас есть метод getRecordsForColors(colors)
, который выполняет реальную фильтрацию (или реальный запрос к БД). Какой-то очень наивный подход будет выглядеть следующим образом (обратите внимание, я не пробовал этот код, поэтому может быть много мелких ошибок):
cache = dict()
def getRecordsCached(colors):
global cache
if colors not in cache:
records = getRecordsForColors(colors)
cache[colors] = records
return records
else:
return cache[colors]
Очевидный недостаток этого подхода заключается в том, что вы должны хранить в кэше все комбинации цветов, даже если они используются только одним пользователем, а это может быть много.
Более разумный подход - выбрать threshold
, например, 3 цвета, для которых можно сохранить все комбинации:
cache = dict()
def getRecordsCached(colors):
global cache
if colors not in cache:
records = getRecordsForColors(colors)
if len(colors) < threshold:
cache[colors] = records
return records
else:
return cache[colors]
Это охватит большинство пользователей, и те пользователи с редкими длинными комбинациями будут выдавать несколько дублированных запросов.
Очевидно, что вам вообще не нужно использовать наивный dict
кэш или кэш в памяти. Вы можете кэшировать данные в одной и той же БД или использовать специализированную для кеша БД, такую как Memcached или Redis. Также вместо порога в форме длины colors
вы можете использовать некоторую специализированную библиотеку кеша, которая поддерживает кэш LRU, или некоторую другую замену полиции
Наконец, если ваша логика заключается в том, что результат для данного набора цветов представляет собой просто объединение результатов для каждого цвета, вы можете попытаться покрыть эти редкие большие комбинации цветов на стороне клиента, кэшируя результаты для каждого цвета отдельно и затем, если комбинация цветов не находится непосредственно в кэше, вычислите ее, объединив элементы в кэшированных результатах для каждого цвета.