
1. Caching 개념
캐싱은 접근 속도가 느린 데이터를 빠르게 사용할 수 있도록 임시 저장소(캐시)에 저장하여 재사용하는 기술입니다.
주로 반복적으로 사용하는 데이터나 연산 결과를 저장해 다음 요청시에 계산을 생략하는 방식으로 성능을 최적화합니다.
웹 브라우저와 캐싱
흔히 브라우저 속도가 느리거나 작동이 잘 안되면 캐시 삭제해라 이런 말 많이 들어보셨을텐데
웹 브라우저는 우리가 방문했던 웹 페이지 데이터를 *로컬 캐시에 저장합니다.
*로컬 캐시는 일반적으로 RAM, 디스크, 특정 애플리케이션의 메모리 공간에 저장됩니다. 그래서 네트워크나 원격 서버와 통신하지 않고 로컬 저장소에서 바로 데이터 접근을 하기 때문에 속도가 빠릅니다.
저장된 데이터는 일시적 저장 형태로 프로그램이 종료 되거나 캐시 만료 시간이 지나면 삭제가 될 수 있습니다.
예를 들어 사용자가 브라우저를 통해서 어느 웹 사이트를 방문했을때 리소스(html, css, images, script)등 로컬 디스크에 캐싱하고,
다음에 동일한 웹 사이트를 재 방문했을 때 네트워크 요청 없이 로컬에 저장된 데이터를 불러와서 빠르게 로드합니다.
서버 사이드 캐싱
서버 캐싱은 클라이언트 요청에 대한 연산 결과를 캐시에 저장하고 동일한 요청이 들어왔을 때 캐시 데이터를 반환하여 서버 부하를 줄이는 기술입니다.
예를 들면 DB 쿼리 결과를 캐싱하여서 데이터 베이스 부하를 줄이고 요청 응답 속도를 높히거나, 애플리케이션에 자주 사용하는 데이터를 미리 캐싱하여서 DB 접근을 최소화하는 작업들입니다.
하드웨어 캐싱
하드웨어에서도 캐싱은 자주 사용되는데, CPU 내부의 캐시 메모리는 자주 사용하는 데이터를 RAM 대신 빠르게 접근 가능한 메모리에 저장하여 처리 속도를 향상 시킵니다. 하드 디스크(HDD, SSD)의 일부를 캐시로 사용하여 디스크 접근 속도를 개선합니다.
네트워크 캐싱
프록시 서버나 CDN(content delivery network)에서 캐싱이 활용됩니다. 사용자와 가까운 CDN 서버에 자주 요청되는 데이터를 저장하여 원본 서버 대신 캐시된 데이터를 반환합니다.
이렇게 캐시 주요 목적은 1.성능최적화 2.리소스 절약 3.네트워크 효율성 향상으로 정리할 수 있겠습니다.
2. 메모이제이션(Memoization)
메모이제이션은 함수 결과를 캐싱하여 동일한 입력 값에 대해 재연산을 하지 않고 저장된 결과를 반환하는 기법으로 캐싱의 일종입니다.
아래 코드는 딕셔너리와 in 문법으로 캐싱을 간단하게 구현한 예시입니다.
cache라는 빈 딕셔너리를 정의해두고
파라메터로 받은 a, b 값을 in 연산자로 딕셔너리 key에 (a, b) 튜플 데이터가 존재하는지 확인합니다.
(파이썬 딕셔너리에서 in 연산자는 key 대상으로 검색을 합니다)
(a, b)가 cache의 키로 존재하면 cahe key로 리턴을 하고,
키가 없으면 연산한 결과 값을 전달 받은 파라메터 구성의 cache key 값에 저장하여 result를 값을 리턴합니다.
cache = {}
def multiply(a, b):
if (a, b) in cache: # 캐시에 결과가 있다면
return cache[(a, b)]
print(f"Calculating {a} * {b}") # 중복 계산 확인용 출력
result = a * b
cache[(a, b)] = result # 계산 결과를 캐시에 저장
return result
# 함수 호출
print(multiply(3, 4)) # Calculating 3 * 4 -> 12 출력
print(multiply(3, 4)) # 캐시에서 가져옴 -> 12 출력
print(multiply(5, 6)) # Calculating 5 * 6 -> 30 출력
print(multiply(3, 4)) # 캐시에서 가져옴 -> 12 출력
# 출력
Calculating 3 * 4
12
12
Calculating 5 * 6
30
12
출력 결과에서 중복 연산인 결과는 print 구문이 출력되지 않습니다.
연산을 최소화한 것을 알 수 있습니다.
이렇게 파이썬에서 직접 메모이제이션을 구현할 수 있고, @cache 데코레이터를 활용하면 더 깔끔하게 처리할 수 있습니다.
3. @cache 데코레이터
파이썬에 내장된 functool 모듈에서 불러올 수 있고 함수 대상으로 사용합니다.
어떤 함수 위에 @cache 데코레이터를 선언하면
@cache는 내부적으로 딕셔너리 같은 자료구조를 사용하여 함수 입력값(키)과 출력값(값)을 자동으로 저장하고 관리합니다.
조건문을 통해 중복 값이 존재하는지 로직 장성을 하지 않아도 되어서 코드가 간결해집니다.
from functools import cache
@cache
def multiply(a, b):
print(f"Calculating {a} * {b}")
return a * b
# 함수 호출
print(multiply(3, 4)) # Calculating 3 * 4 출력, 결과 12
print(multiply(3, 4)) # 캐시 사용, 결과 12
print(multiply(5, 6)) # Calculating 5 * 6 출력, 결과 30
print(multiply(3, 4)) # 캐시 사용, 결과 12
'Programming👩🏻💻 > Python' 카테고리의 다른 글
[Python] - decorator 데코레이터 개념 @staticmethod, @classmethod (1) (1) | 2024.12.09 |
---|---|
[pandas 🐼] - 기본 데이터 구조 (0) | 2024.12.02 |
Statements vs Expressions 차이 (0) | 2024.11.11 |
파이썬 모듈, 패키지 (0) | 2024.11.10 |
시퀀스 연산 (0) | 2024.11.05 |