Комментарии 17
Интересный способ, а что если уменьшить потери памяти за счет использования функции hash():
key = hash( cPickle.dumps((args, sorted(kwargs.iteritems()))) )
key = hash( cPickle.dumps((args, sorted(kwargs.iteritems()))) )
зависит от размера пиклезованых аргументов. если небольшие — hash создаст лишние вычислительные расходы. Если большие — действительно, неплохо.
Время вычисления хеша на порядок меньше времени «пиклизации» (несложно написать 3 строки и убедиться в этом), так что это не создаст большую проблему, а экономия памяти будет значительная. Кстати, если передаваемые аргументы имеют большой размер, то сложность вычислений bigfunc должна быть больше, чем dumps, что бы вообще имела смысл меморизация.
А что будет если функция рекурсивная, а мы хотим добавить Memoization, чтобы переделать её в динамический алгоритм? Этот метод подойдет? Если да, то очень элегантно…
Я так понимаю, что закешируются все промежуточные значения. Поэтому, если уровней рекурсии было много, получим много бесполезного ужаса, поиск по которому может оказаться неэффективнее повторного вычисления.
а память не утечет?
вычисленные результаты будут храниться все время существования функции (до del, например). чуть модифицировав можно ограничить как количество так и время хранения. но это уже по желанию :]
«утечка» как таковая в питоне в принципе невозможна. как только пропадут все ссылки на объект, за ним придет GC :]
«утечка» как таковая в питоне в принципе невозможна. как только пропадут все ссылки на объект, за ним придет GC :]
Большое спасибо, позновательно и необычно.
Хотелось бы видеть больше статей на тему декораторов.
Хотелось бы видеть больше статей на тему декораторов.
Сразу вспоминается вот это: code.activestate.com/recipes/498245/
Там еще сделан LRU cache, для экономии памяти, но не используется pickle
Там еще сделан LRU cache, для экономии памяти, но не используется pickle
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Memoization в Python