Решение, которое работает как с аргументами positional, так и с ключевыми словами независимо от порядка, в котором были переданы ключевые слова args (используя inspect.getargspec ):
import inspect
import functools
def memoize(fn):
cache = fn.cache = {}
@functools.wraps(fn)
def memoizer(*args, **kwargs):
kwargs.update(dict(zip(inspect.getargspec(fn).args, args)))
key = tuple(kwargs.get(k, None) for k in inspect.getargspec(fn).args)
if key not in cache:
cache[key] = fn(**kwargs)
return cache[key]
return memoizer
Аналогичный вопрос: Идентификация эквивалентных функций функции varargs для memoization в Python
18 января 2019 г. в 13:43 На данный момент вам нужны два индекса, чтобы покрыть основное правило ОБА левому и правому объектам JOIN = нужен индекс. 1. ALTER TABLE tbl_workermap ДОБАВИТЬ ИНДЕКС idx_t_w_map_job_id (job_id) 2. ALTER TABLE tbl_workermap ДОБАВИТЬ ИНДЕКС idx_t_w_map_wrk_user_id (worker_user_id) после создания, запустить EXPLAIN ..... для просмотра нового плана выполнения.
Если вы еще этого не сделали, создайте кластеризованный индекс, установив первичный ключ (при условии, что таблицы должным образом нормализованы). (Если вы этого не сделаете, вы, вероятно, захотите настроить ограничения внешнего ключа .)
Если бы этот вопрос касался Microsoft SQL Server , я бы порекомендовал создание хранимой процедуры, особенно если этот запрос выполняется часто как некий регулярный процесс. Как отмечалось в в этом ответе , однако, основное преимущество в производительности для простых запросов, подобных этому, будет зависеть от дизайна таблицы и индексов.
Предполагая, что это действительно много: много, здесь здесь есть несколько советов по оптимизации этой таблицы.
Не используйте LEFT
, если вы не ожидаете, что в «правильной» таблице пропущена нужная строка.
Совет по стилю: избавьтесь от tbl_
, user_
(за исключением user_id
) и т. Д. То есть префиксы в именах являются беспорядочными и избыточными в контексте. Будьте последовательны в отношении «пользователь» и «работник».
Иметь таблицу «многие: многие» с именами обеих целей (например, worker_job
). Однако теперь я вижу, что это больше, чем просто таблица сопоставления многих: многих; это больше похоже на таблицу для назначения и отслеживания того, кто над чем работает со временем ?
Если вам нужно и история того, кто работал над чем и Текущее состояние тех, кто над чем работает, рассмотрим наличие двух таблиц. История продолжает расти; «ток» постоянно меняется.
Используйте подходящие типы данных, такие как DATE
и DATETIME
.
Используйте InnoDB вместо MyISAM.