2016-04-03 2 views
2

Я пишу memoizing decorator для Python 3. План состоит в том, чтобы рассортить кеш во временном файле, чтобы сэкономить время на нескольких исполнениях.Должен ли я хранить временные файлы в папке __pycache__?

Кэш будет удален, если файл, содержащий украшенную функцию, был изменен, как и файл .pyc в __pycache__. Итак, я начал думать о том, чтобы разжечь каталог проекта пользователя, поставив маринованный кэш в __pycache__. Есть ли побочные эффекты хранения файлов в этом каталоге? Это вводит в заблуждение или запутывает?

+0

Я не понимаю, что на самом деле делает ваш мемориальный декоратор. Не могли бы вы объяснить это? – 3442

+0

Конечно! Декоратор изменяет поведение функции, чтобы параметры и их результаты сохранялись в словаре (кеше). Когда функция вызывается, она проверяет, была ли функция уже оценена для этих параметров. Если это так, функция смотрит вверх и возвращает результат в словаре, а не повторяет вычисления. –

+0

О, отличная идея! Это потребует, чтобы функция была чистой. Однако что с этим связано '__pycache__'? ** Изменить **: Теперь я понимаю; написав ответ. – 3442

ответ

0

Вы должны либо ...

  • Есть все кэширование случиться во время выполнения: Это бьет свою цель. Тем не менее, это единственный способ не касаться файловой системы вообще.
  • Выделите специальную папку, такую ​​как __memo__ или что-то: Это позволит вам иметь кеширование в нескольких исполнениях. Однако вы будете «загрязнять» структуру файла приложения.

Причины вы должны никогда запутались с __pycache__:

  • __pycache__ является CPython-специфичны. Хотя это, скорее всего, реализация, которую вы используете прямо сейчас, не является переносимой/безопасной/хорошей практикой, предполагающей, что все делаются без уважительной причины.
  • __pycache__ предназначен для прозрачной оптимизации, то есть никто не должен заботиться о том, существует ли она вообще или нет. Это дизайнерское решение от людей CPython, и поэтому вы не должны его обойти.
  • Из-за вышесказанного вышеупомянутый каталог может быть отключен, если пользователь хочет. Например, в CPython, если вы делаете python3 -B myapp.py, no __pycache__ будет создан, если он не существует, и в противном случае будет проигнорирован.
  • Пользователи часто удаляют __pycache__ из-за вышеуказанных двух точек по нескольким причинам. По крайней мере, я.
  • Промежуточные вещи внутри __pycache__, потому что «это не загрязняет файловую структуру приложения» - это иллюзия. Каталог прекрасно понимается как «загрязнение». Если интерпретатор Python уже загрязняет материал, почему вы не можете с __memo__ в любом случае?
+0

Ahhh, я думаю, что дополнительная папка - это путь, вы делаете хорошие моменты. Но помните, что мы можем просто создать папку pycache, если она не существует. Поэтому я думаю, что проблема переноса важна как потенциальная причина путаницы: «Я запустил свой скрипт с -B, так почему у меня теперь есть папка pycache?» или «Почему моя функция не memoized? Все, что я сделал, это удалить папку pycache ...» –

+0

Хм, эти моменты не убеждают меня. Большинство из них на самом деле являются аргументами для хранения memoization в том же каталоге. Вероятно, тогда можно обнаружить и -B-переключатель и включить мемонирование. Мы можем видеть memoization как форму оптимизации, поэтому, если пользователь удаляет '__pycache__', возможно, это нормально, чтобы перезапустить memoization. – Mitar

Смежные вопросы