Mam zestaw tablic, które są bardzo duże i kosztowne do obliczenia, i nie wszystkie będą koniecznie potrzebne moim kodem w danym uruchomieniu. Chciałbym, aby ich deklaracja była opcjonalna, ale idealnie, bez konieczności przepisywania całego mojego kodu.zmienne leniwy Pythona? lub, opóźnione kosztowne obliczenia
Przykład jak to jest teraz:
x = function_that_generates_huge_array_slowly(0)
y = function_that_generates_huge_array_slowly(1)
Przykład tego, co chciałbym zrobić:
x = lambda: function_that_generates_huge_array_slowly(0)
y = lambda: function_that_generates_huge_array_slowly(1)
z = x * 5 # this doesn't work because lambda is a function
# is there something that would make this line behave like
# z = x() * 5?
g = x * 6
Podczas korzystania lambda jak wyżej osiąga jeden z pożądanych efektów - wyliczenia tablica jest opóźniona, dopóki nie jest potrzebna - jeśli użyjesz zmiennej "x" więcej niż raz, musisz ją wyliczyć za każdym razem. Chciałbym to obliczyć tylko raz.
EDYCJA: EDYCJA: Po kilku dodatkowych poszukiwaniach wygląda na to, że można zrobić to, co chcę (w przybliżeniu) za pomocą "leniwych" atrybutów w klasie (np. http://code.activestate.com/recipes/131495-lazy-attributes/). Nie sądzę, że jest jakiś sposób na zrobienie czegoś podobnego bez stworzenia oddzielnej klasy?
EDIT2: Próbuję zaimplementować niektóre z rozwiązań, ale biegnę do problemu, bo nie rozumieją różnicy między:
class sample(object):
def __init__(self):
class one(object):
def __get__(self, obj, type=None):
print "computing ..."
obj.one = 1
return 1
self.one = one()
i
class sample(object):
class one(object):
def __get__(self, obj, type=None):
print "computing ... "
obj.one = 1
return 1
one = one()
Myślę, że niektóre warianty na tych jest to, czego szukam, ponieważ drogie zmienne mają być częścią klasy.
http://stackoverflow.com/questions/5078726/setting-a-property-inside-a-python-method jest bardziej użyteczną implementacją lenistwa dla tego co próbuję zrobić – keflavich