ленивые переменные python? или, отложенное дорогостоящее вычисление

У меня есть набор массивов, которые очень велики и дороги в вычислении, и не все они обязательно понадобятся моему коду при каждом конкретном запуске. Я хотел бы сделать их объявление необязательным, но в идеале без необходимости переписывать весь свой код.

Пример того, как это сейчас:

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» более одного раза, она должна вычисляться каждый раз. Я хотел бы вычислить его только один раз.

РЕДАКТИРОВАТЬ: После некоторого дополнительного поиска похоже, что можно делать то, что я хочу (приблизительно), с "ленивыми" атрибутами в классе (например, http://code.activestate.com/recipes/131495-lazy-attributes/ ). Я не думаю, что есть способ сделать что-то подобное без создания отдельного класса?

EDIT2: Я пытаюсь реализовать некоторые решения, но у меня возникает проблема, потому что я не понимаю разница между:

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()

Я думаю, что я ищу некоторые вариации в них, поскольку дорогие переменные предназначены для того, чтобы быть частью класса.

13
задан keflavich 22 August 2011 в 19:47
поделиться