소프트웨어-이야기/프로그래밍 언어와 프레임워크
(Django) cached_property 란?
americano_people
2019. 4. 20. 17:25
동일한 인스턴스의 Property를 여러번 호출하는 경우, 중복으로 연산작업을 하게 된다.
Property 안에서 호출하는 함수가 비용이 큰 연산작업인 경우, 중복 연산 작업이 API 성능을 크게 떨어트릴 수 있다.
Django의 cached_property decorator를 사용하면 이러한 이슈를 해결할 수 있다.
cached_property는 처음 호출된 Property 함수 결과값을 캐싱해둔다. 그리고 이후에는 캐싱된 결과값을 리턴한다.
그러면 동일한 Property를 여러번 호출하더라도, 한 번의 연산만 하게 된다.
Sample
from django.utils.functional import cached_property
from weather.utils import WeatherAPI
from django.utils.timezone import datetime
class TodayWeather:
@cached_property
def weather(self):
# 비싼 연산작업이 필요하고, 여러번 호출되는 값은 @cached_property으로 캐싱해두자!
# ex. DB / ElasticSearch / API 통신 등..
target_date = datetime.today()
weather = WeatherAPI.call(target_date=target_date)
return weather
@property
def temperature(self):
self.weather['temperature']
@property
def rain_rate(self):
self.weather['rain_rate']
today_weather = TodayWeather()
print(f'온도 : {today_weather.temperature}')
print(f'비가 올 확률 : {today_weather.rain_rate}')
만약 위의 코드에서 weather property를 캐싱해두지 않았다면, 날씨를 조회하는 Weather API는 2번 호출된다.
그런데 cached_property으로 설정해두면, 이미 연산했던 캐시 값을 반환하기 때문에 Weather API는 1번만 호출된다.
Cache Range
캐싱 데이터는 해당 인스턴스에서만 접근할 수 있다.
그리고 해당 인스턴스가 살아있는 동안에만 유지된다. 때문에, 인스턴스 메모리가 해제되면 캐시된 프로퍼티 데이터도 사라진다.
Django 성능 최적화 아티클을 보면, cached property에 대한 내용들이 항상 언급된다. 성능 최적화를 할 때, 유용한 함수인 것 같다 ~_~
참고
Django Patterns: Fat Models and cached_property
< 끝 >