Ho un set di array che sono molto grandi e costosi da calcolare, e non tutti saranno necessariamente necessari dal mio codice in ogni esecuzione. Mi piacerebbe rendere la loro dichiarazione opzionale, ma idealmente senza dover riscrivere il mio intero codice.variabili pigro python? o, calcolo costoso ritardato
Esempio di come è ora:
x = function_that_generates_huge_array_slowly(0)
y = function_that_generates_huge_array_slowly(1)
esempio di quello che vorrei fare:
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
Durante l'utilizzo di lambda come sopra raggiunge uno degli effetti desiderati - calcolo del la matrice viene ritardata fino a quando non è necessaria, se si utilizza la variabile "x" più di una volta, deve essere calcolata ogni volta. Mi piacerebbe calcolarlo solo una volta.
MODIFICA: Dopo alcune ricerche aggiuntive, sembra che sia possibile fare ciò che voglio (approssimativamente) con attributi "pigri" in una classe (ad esempio http://code.activestate.com/recipes/131495-lazy-attributes/). Suppongo che non ci sia modo di fare qualcosa di simile senza fare una lezione separata?
EDIT2: Sto cercando di attuare alcune delle soluzioni, ma sto correndo per un problema perché non capisco la differenza tra:
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()
e
class sample(object):
class one(object):
def __get__(self, obj, type=None):
print "computing ... "
obj.one = 1
return 1
one = one()
Penso che alcune variazioni su questi sono ciò che sto cercando, dal momento che le variabili costose sono destinate a far parte di una classe.
http://stackoverflow.com/questions/5078726/setting-a-property-inside-a-python-method è un'implementazione più utile della pigrizia per ciò che sto cercando di fare – keflavich