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