У меня есть набор массивов, которые очень большие и дорогостоящие для вычисления, и мой код не обязательно будет нужен для каждого конкретного прогона. Я хотел бы сделать их объявление необязательным, но в идеале без необходимости переписывать весь мой код.
Пример того, как это сейчас:
x = function_that_generates_huge_array_slowly(0)
y = function_that_generates_huge_array_slowly(1)
Пример того, что я хотел бы сделать:
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
При использовании лямбды, как описано выше, достигается один из желаемых эффектов - вычисление массива откладывается до тех пор, пока оно не потребуется - если вы используете переменную «x» более одного раза, она должна вычисляться каждый раз. Я хотел бы вычислить это только один раз.
EDIT:
После некоторого дополнительного поиска, похоже, что можно делать то, что я хочу (приблизительно) с «ленивыми» атрибутами в классе (например, http://code.activestate.com/recipes/131495-lazy-attributes/).. Я не думаю, что есть какой-либо способ сделать что-то подобное без создания отдельный класс?
РЕДАКТИРОВАТЬ2: Я пытаюсь реализовать некоторые из решений, но я столкнулся с проблемой, потому что я не понимаю разницу между:
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()
и
class sample(object):
class one(object):
def __get__(self, obj, type=None):
print "computing ... "
obj.one = 1
return 1
one = one()
Я думаю, что это то, что я искал, потому что дорогие переменные должны быть частью класса.