Обработчик заметок

Является ли «хорошей практикой» создать класс, подобный ниже, который может обрабатывать процесс memoization для вас? Преимущества memoization настолько велики (в некоторых случаях, как этот, где он падает с 501003 до 1507 вызовов функций и от 1,409 до 0,006 секунды времени процессора на моем компьютере), что, похоже, такой класс будет полезен.

Однако я читал только отрицательные комментарии об использовании eval() . Является ли это использование этого оправданным, учитывая гибкость такого подхода?

Это может автоматически сэкономить любое возвращаемое значение за счет потери побочных эффектов. Благодарю.

 import cProfile class Memoizer(object): """A handler for saving function results.""" def __init__(self): self.memos = dict() def memo(self, string): if string in self.memos: return self.memos[string] else: self.memos[string] = eval(string) self.memo(string) def factorial(n): assert type(n) == int if n == 1: return 1 else: return n * factorial(n-1) # find the factorial of num num = 500 # this many times times = 1000 def factorialTwice(): factorial(num) for x in xrange(0, times): factorial(num) return factorial(num) def memoizedFactorial(): handler = Memoizer() for x in xrange(0, times): handler.memo("factorial(%d)" % num) return handler.memo("factorial(%d)" % num) cProfile.run('factorialTwice()') cProfile.run('memoizedFactorial()') 

  • python сбрасываемый экземпляр метод memoization decorator
  • Использует ли Python статические строки?
  • Запоминание, когда аргументы могут быть очень большими
  • Python ленивый оценщик
  • Декораторы для выборочного кеширования / заметок
  • Хранение вычисленных значений в объекте
  • Храните кеш в файле functools.lru_cache в Python> = 3.2
  • Как я могу memoize экземпляр класса в Python?
  • 2 Solutions collect form web for “Обработчик заметок”

    Вы можете memoize, не прибегая к eval .

    A (очень простой) memoizer:

     def memoized(f): cache={} def ret(*args): if args in cache: return cache[args] else: answer=f(*args) cache[args]=answer return answer return ret @memoized def fibonacci(n): if n==0 or n==1: return 1 else: return fibonacci(n-1)+fibonacci(n-2) print fibonacci(100) 

    eval часто ошибается как evil первую очередь потому, что идея выполнения «строк» ​​во время выполнения чревата соображениями безопасности. Вы достаточно избежали кода? Кавычки? И множество других раздражающих головных болей. Ваш обработчик memoise работает, но на самом деле это не Python. Подход MAK намного более Pythonic. Попробуем несколько экспериментов.

    Я отредактировал обе версии и запустил их только один раз с 100 в качестве входных данных. Я также переместил экземпляр Memoizer . Вот результаты.

     >>> timeit.timeit(memoizedFactorial,number=1000) 0.08526921272277832h >>> timeit.timeit(foo0.mfactorial,number=1000) 0.000804901123046875 

    В дополнение к этому, ваша версия требует обертки вокруг функции, которая должна быть замечена, которая должна быть записана в строке. Это уродливо. Решение MAK является чистым, поскольку «процесс memoisation» инкапсулирован в отдельную функцию, которая может быть удобно применена к любой дорогостоящей функции ненавязчивым образом. Это не очень Pythonic. У меня есть некоторые подробности о написании таких декораторов в моем учебнике по Python по адресу http://nibrahim.net.in/self-defence/, если вы заинтересованы.

    Interesting Posts

    Python самый быстрый способ прочитать большой текстовый файл (несколько GB)

    Преобразование объекта состояния Tweepy в JSON

    Как наложить строку на фиксированную длину с пробелами в Python?

    python использует неверный префикс пространства имен в запросе SOAP

    Лучший язык программирования для обработки медицинских изображений

    Asyncio persisent клиентский класс протокола с использованием очереди

    Проверьте CSV на данный формат

    объект привязанного и несвязанного метода python

    Установка MySQL Python в Mac OS X

    Создание и использование StanfordTagger в NLTK

    Используя библиотеку «запросы» Python, как я могу определить, является ли ConnectionError клиентской или серверной?

    Как получить html-письмо в виде обычного текста?

    Flask – регистрация после сброса ответа

    Издевательство над функцией для исключения исключения для проверки исключающего блока

    'ascii' кодек не может декодировать байт (проблема при использовании django)

    Python - лучший язык программирования в мире.