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