Lazy evaluation

Table of Contents


The benefits of lazy evaluation includes:

  • evaluation of an expression until its value is needed
  • avoid repeated evaluation(sharing), and reduce the running time
  • can define control flow

How to use in Python:

One example is:

class Person:
    def __init__(self, name):
        self.name = name
        self.relatives = self._get_all_relatives()
    def _get_all_relatives(self):
        # this is a more expensive op

So It may take long time , when initialization the class.

Better approach is:

class Person:
    def __init__(self, name):
        self.name = name
        self._relatives = []

    @property
    def relatives(self):
        if not self._relatives:
            self._relatives = _get_all_..()
        return self._relatives

And more Pythonic approach(using decorator):

def lazy_property(fn):
    attr_name = '_lazy_' + fn.__name__
    @property
    def _lazy_property(self):
        if not hasattr(self, attr_name):
            setattr(self, attr_name, fn(self))
        return getattr(self, attr_name)
    return _lazy_property

class Person:
    def __init__(self, name):
        self.name = name
        self._relatives = []

    @lazy_property
    def relatives(self):
        relatives = # getall
        return relatives

References: