Delay initialization for Python Performance Improvement and python Performance Improvement
The so-called latency Calculation of class attributes defines the class attributes as a property, which is calculated only when accessed. Once accessed, the results will be cached, you do not need to calculate it every time. The main purpose of constructing a delayed computing attribute is to improve performance.
Property
Before proceeding to the topic, let's take a look at the usage of property. property can convert access to properties into method calls.
class Circle(object): def __init__(self, radius): self.radius = radius @property def area(self): return 3.14 * self.radius ** 2 c = Circle(4) print c.radius print c.area
As you can see, although area is defined as a method, after adding @ property, you can directly execute c. area as a property access.
Now the question is, every call to c. area will be calculated once, which is a waste of cpu. How can we calculate only once? This is lazy property.
Code Implementation
class LazyProperty(object): def __init__(self, func): self.func = func def __get__(self, instance, owner): if instance is None: return self else: value = self.func(instance) setattr(instance, self.func.__name__, value) return valueimport mathclass Circle(object): def __init__(self, radius): self.radius = radius @LazyProperty def area(self): print 'Computing area' return math.pi * self.radius ** 2 @LazyProperty def perimeter(self): print 'Computing perimeter' return 2 * math.pi * self.radius
Description
Defines a LazyProperty class for delayed computing. Circle is used for testing. The Circle class has three attributes: radius, area, and perimeter ). LazyProperty is decorated with the property of area and perimeter. Let's try the magic of LazyProperty:
>>> c = Circle(2)>>> print c.areaComputing area12.5663706144>>> print c.area12.5663706144
"Computing area" is printed every time calculated in area (). After Calling c. area twice in a row, "Computing area" is printed only once. This benefits from LazyProperty. After a call, no matter how many subsequent calls are called, the calculation will not be repeated.