Tengo un conjunto de matrices que son muy grandes y costosas de computar, y no necesariamente todo será necesario para mi código en cualquier ejecución dada. Me gustaría hacer su declaración opcional, pero idealmente sin tener que volver a escribir todo el código.python variables perezosas? o, cómputo caro retrasado
Ejemplo de cómo es ahora:
x = function_that_generates_huge_array_slowly(0)
y = function_that_generates_huge_array_slowly(1)
Ejemplo de lo que me gustaría hacer:
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 el uso de lambda que el anterior alcanza uno de los efectos deseados - cálculo de la la matriz se retrasa hasta que sea necesaria; si utiliza la variable "x" más de una vez, debe calcularse cada vez. Me gustaría calcularlo solo una vez.
EDIT: Después de algunas búsquedas adicionales, parece que es posible hacer lo que quiero (aproximadamente) con atributos "flojos" en una clase (por ejemplo, http://code.activestate.com/recipes/131495-lazy-attributes/). Supongo que no hay forma de hacer algo similar sin hacer una clase por separado.
Edit2: estoy tratando de poner en práctica algunas de las soluciones, pero estoy corriendo para un problema porque no entiendo la diferencia entre:
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()
y
class sample(object):
class one(object):
def __get__(self, obj, type=None):
print "computing ... "
obj.one = 1
return 1
one = one()
Creo que esto es lo que estoy buscando, ya que las costosas variables pretenden ser parte de una clase.
http://stackoverflow.com/questions/5078726/setting-a-property-inside-a-python-method es una implementación más útil de la pereza para lo que estoy tratando de hacer – keflavich