Существует ли установленный на диске декоратор memoize для python? - PullRequest
6 голосов
/ 08 декабря 2011

Я немного искал модуль python, который предлагает декоратор memoize со следующими возможностями:

  • Сохраняет кэш на диске для повторного использования при последующих запусках программы.
  • Работает для любых аргументов, способных к засечке, наиболее важно для массивов numpy.
  • (Bonus) проверяет, не изменены ли аргументы в вызовах функций.

Я нашел несколько небольших фрагментов кода для этой задачии, возможно, мог бы реализовать его сам, но я бы предпочел иметь установленный пакет для этой задачи.Я также нашел incpy , но это не похоже на работу со стандартным интерпретатором Python.

В идеале, я хотел бы иметь что-то вроде functools.lru_cache плюс кешхранение на диске.Может кто-нибудь указать мне подходящий пакет для этого?

Ответы [ 2 ]

2 голосов
/ 20 ноября 2013

Я понимаю, что это вопрос 2-х летнего возраста, и он не будет считаться "установленным" декоратором, но ...

Это достаточно просто, и вам не нужно беспокоитьсяо только с использованием установленного кода.Модуль docs ссылается на источник , поскольку, помимо того, что он полезен сам по себе, он работает как пример кода.

Итак, что вам нужнодобавлять?Добавьте параметр filename.Во время выполнения, pickle.load имя файла в cache, используя {}, если это не удается.Добавьте cache_save функцию, которая просто pickle.save s кеширует файл под блокировкой.Присоедините эту функцию к wrapper так же, как к существующим (cache_info и т. Д.).

Если вы хотите автоматически сохранить кэш, а не оставлять его на усмотрение вызывающего, это просто;это просто вопрос, когда это сделать.Любая опция, с которой вы столкнетесь - atexit.register, добавление аргумента save_every, чтобы сохранить все save_every пропуски, ... - тривиально реализовать.В этом ответе я показал, как мало работы требуется.Или вы можете получить полную рабочую версию (для настройки или использования как есть) на GitHub .

Существуют и другие способы ее расширения - добавить статистику, связанную с сохранением (время последнего сохранения, попадания и пропуски с момента последнего сохранения,…) в cache_info, скопируйте кэш и сохраните его в фоновом потоке вместо сохранения в строке и т. д. Но я не могу придумать ничего, что стоило бы сделатьэто было бы нелегко.

2 голосов
/ 08 декабря 2011

Я не знаю ни одного декоратора memoize, который позаботится обо всем этом, но вы можете взглянуть на ZODB .Это система персистентности, построенная поверх pickle, которая предоставляет некоторые дополнительные функции, включая возможность перемещать объекты из памяти на диск, когда они не используются, и возможность сохранять только объекты, которые были изменены.

Изменить: как продолжение для комментария.Декоратор памятки не поддерживается ZODB "из коробки".Однако я думаю, что вы можете:

  • Реализовать свой собственный постоянный класс
  • Использовать декоратор памятки в нужных вам методах (любая стандартная реализация должна работать, новероятно, его необходимо изменить, чтобы убедиться, что установлен dirty bit )

После этого, если вы создадите объект этого класса и добавите его в базу данных ZODB,при выполнении одного из запомненных методов объект будет помечен как грязный, а изменения будут сохранены в базе данных при следующей операции фиксации транзакции.

...