lru_cache로 파이썬 함수 캐시하기

3696 단어 python
코드 속도를 높이는 가장 쉬운 방법은 더 적은 코드를 실행하는 것입니다. 반복 작업의 양을 줄이는 일반적인 기술은 다음에 동일한 작업을 수행해야 할 때 캐시에서 간단히 검색할 수 있는 것을 다시 계산할 필요가 없도록 캐시를 구현하는 것입니다.

lru_cache



파이썬에서 설정하는 가장 쉽고 가장 일반적인 것은 내장된 functools.lru_cache입니다.

from functools import lru_cache

@lru_cache
def get_cars():
    print('pulling cars data')
    return pd.read_csv("https://waylonwalker.com/cars.csv", storage_options = {'User-Agent': 'Mozilla/5.0'})


lru_cache를 사용하는 경우



동일한 입력으로 함수가 호출될 때마다 동일한 결과를 기대하는 함수가 있을 때마다 lru_cache를 사용할 수 있습니다.

when same *args, **kwargs always return the same value



lru_cache는 하나의 파이썬 프로세스에서만 작동합니다. 여러 하위 프로세스를 실행하거나 동일한 스크립트를 반복해서 실행하는 경우 lru_cache가 작동하지 않습니다.

lru_cache only caches in a single python process



최대 크기



lru_cache는 선택적 매개변수maxsize를 사용하여 캐시 크기를 설정할 수 있습니다. 기본적으로 128 로 설정되어 있습니다. 캐시에 더 많거나 적은 항목을 저장하려는 경우 이 값을 조정할 수 있습니다.
get_cars 예제는 약간 독특한 예제입니다. 지적했듯이 이 구현은 싱글톤처럼 작동하며 값을 1로 설정하여 캐시에 포함할 항목 수를 정확히 할당하여 캐시 크기를 최적화할 수 있습니다.

from functools import lru_cache

@lru_cache(maxsize=1)
def get_cars():
    print('pulling cars data')
    return pd.read_csv("https://waylonwalker.com/cars.csv", storage_options = {'User-Agent': 'Mozilla/5.0'})


내 예는 규칙을 약간 늘립니다.



위의 예는 웹 요청을 수행합니다. 데이터 엔지니어로서 저는 종종 짧은 시간 동안 실행된 후 중지되는 스크립트를 작성합니다. 나는 이 작업이 실행되는 동안 이 함수의 출력이 변경될 것으로 예상하지 않으며 만약 변경되었다면 어쨌든 실제로 일치하기를 원할 수 있습니다.

web request do change their output



웹앱을 구축하거나 오랫동안 실행되는 일종의 프로세스라면. 작업을 시작하고 기다리는 것, 이것은 lru_cache의 좋은 적용이 아닐 수 있습니다. 이 프로세스가 며칠 또는 몇 달 동안 실행되는 경우 요청이 변경되지 않는다는 내 가정은 더 이상 유효하지 않습니다.

lru_cache에 대해 유형이 지정된 kwarg도 있습니다.



이것은 나에게 새로운 것이지만 값뿐만 아니라 함수에 전달되는 값의 유형을 캐시할 수 있습니다.

(from the docstring)
If typed is True, arguments of different types will be cached separately.
For example, f(3.0) and f(3) will be treated as distinct calls with distinct
results.

좋은 웹페이지 즐겨찾기