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 DB 최적화

 

Django DB 최적화

Django에서 데이터 베이스를 어떻게 효율적으로 사용하는지에 대해 설명합니다.

tech.peoplefund.co.kr

8퍼센트 성능개선

 

8퍼센트 성능 개선

8퍼센트에 합류한 지 2달이 다 되어간다. 5월에 진행한 8퍼센트 서버 성능 개선에 대한 기록을 남겨보려고 한다.

sebatyler.github.io

 

참고

Django Patterns: Fat Models and cached_property

 

< 끝 >