Python Functools Lru_Cache

Python Functools Lru_Cache
Moduł FunCools Pythona dotyczy wyższych funkcji lub tych, które działają na (i przyjmują jako parametry) lub zwraca inne obiekty, takie jak funkcje. Moduł Functools oferuje różnorodne funkcje, w tym opakowania (FUNC), LRU_CACHE (FUNC), CMP do Key (FUNC) i właściwości buforowanej (FUNC). Należy zauważyć, że metody te akceptują parametry, które są funkcjami. Memoization to metoda poprawiająca wydajność używaną przez wiele języków, a Python nie jest wyjątkiem. Memoizacja obejmuje buforowanie wyników wywołania metodą, aby kolejne połączenia z identycznymi wejściami nie wymagały ponownego obliczenia wyników od zera.

LRU_CACHE, standardowe narzędzie biblioteczne dostarczone przez Pythona, może być użyte do osiągnięcia tego. Dekorator o nazwie LRU_Cache () wykorzystuje podejście memoizacyjne, aby skrócić czas, w którym funkcja jest wykonywana dla tych samych wejść.

Aby zbadać skuteczność pamięci podręcznej i zoptymalizować argument MaxSize, metoda zapakowanej oferuje metodę CACHE_INFO (), która tworzy znakowane krotki zawierające hity, awarie, maxSize i currSize. Ponieważ domyślnie LRU_Cache do buforowania każdego wywołania do metody, którą zawiera, pamięć podręczna może nadal rozszerzać się w nieskończoność.

Prawdopodobnie nie musisz martwić się o to, że pamięć podręczna staje się zbyt duża, jeśli zakres argumentów, które akceptuje Twoja funkcja, jest ograniczony (na przykład jedyne liczby od 1 do 100). Aby zapobiec zużyciu całej pamięci, możesz ograniczyć pamięć podręczną w niektórych okolicznościach do maksymalnych możliwości.
Stąd pochodzi „LRU” w LRU_Cache. LRU lub najmniej często używane jest termin używany do opisania, w jaki sposób obiekty w pamięci podręcznej są natychmiast usuwane. Wszystkie dane są usuwane i zapisywane dla najnowszych elementów pamięci podręcznej X.

Składnia LRU_Cache w Pythonie

Jedną z takich funkcji modułu FunCools, która pomaga w skróceniu czasu wykonywania funkcji poprzez zastosowanie techniki memoizizacji, jest LRU_CACHE (). Poniżej znajduje się składnia LRU_Cache dostarczona przez Pythona:

@lru_cache (maxSize = 128, typed = false)

Dekorator @lru_cache przyjmuje dwa parametry:

Max_Size: maksymalna pojemność pamięci pamięci podręcznej jest wskazana przez tę opcję, po której starsze elementy są usuwane. Gdy zostanie ustawiony na zero, żadne dane nigdy nie zostaną usunięte z pamięci podręcznej, co powoduje, że rośnie wiecznie. Jeśli wiele danych zostanie buforowanych, spowoduje to problemy.

Rodzaje: Ten argument jest boolean. Posiadanie różnych wpisów w pamięci podręcznej dla różnych rodzajów parametrów funkcji jest wskazane, gdy wartość jest ustawiona na true.

Przykład 1: Program do wydrukowania serii Fibonacci

Jak sama nazwa wskazuje, pamięć podręczna utrzymuje najbardziej aktualną parę wejść/wyników, eliminując najpierw najnowsze/najstarsze rekordy. Za pomocą pamięci podręcznej LRU wydrukujemy sekwencję Fibonacciego. Na przykład prosta seria Fibonacci to 1, 1, 2, 3, 5, 8 itp. od 1+1 = 2, 1+2 = 3 i tak dalej. Porównajmy czasy, które funkcja podejmuje podczas korzystania z LRU_Cache, a kiedy nie jest używana do używania czasu.

z Functools import lru_cache
czas importu
def fib_without_cache (n):
Jeśli n < 4:
powrót n
zwróć fib_without_cache (n-1) + fib_without_cache (n-4)
Zacznij = czas.czas()
fib_without_cache (60)
end = czas.czas()
drukuj („Wykonanie czasu bez LRU_Cache IS”, End-Begin)
@Lru_Cache (MaxSize = 128)
def fib_with_cache (n):
Jeśli n < 4:
powrót n
zwróć fib_with_cache (n-1) + fib_with_cache (n-2)
Zacznij = czas.czas()
fib_with_cache (60)
end = czas.czas()
Drukuj („Wykonanie czasu z LRU_Cache IS”, End-Begin)

Tutaj, z modułu Python Functools, zaimportowaliśmy LRU_Cache. Czas jest również importowany do tego skryptu dla wykonania czasu. Następnie mamy definicję funkcji, która nadała nazwę „fib_without_cache”. Funkcja została utworzona w celu obliczenia serii Fibonacciego bez LRU_Cache. Wewnątrz funkcji z warunkiem IF, obliczyliśmy serię Fibonacciego, stosując jej formułę.

Następnie stworzyliśmy obiekt „zacznij”, w którym wywoływana jest funkcja czasu. Czas w sekundach jest przekazywany do funkcji „fib_without_cache”. Z obiektem końcowym zakończyliśmy wykonanie czasu. Seria Fibonacciego jest drukowana bez LRU_Cache przez polecenie drukowania. Seria Fibonacciego została zaimplementowana bez funkcji LRU_CACHE, jak pokazaliśmy.

Teraz wdrażamy funkcję LRU_CACHE. Ustawiamy wartość wejścia max_size na funkcję LRU_CACHE. Korzystając z dekoratora LRU_CACHE, następnie owinęliśmy funkcję „fib_with_cache”. Serię Fibonacciego można bardzo szybko ustalić, robiąc. Seria Fibonacciego jest oceniana przez zastosowanie jej formuły. Wykonanie czasu rozpoczyna się od obiektu początkowego, a kończy się obiektem końcowym. Na koniec wydrukowaliśmy wynik utworzony z dekoratorem LRU_CACHE.

Możesz zobaczyć wyjście serii Fibonacciego z dekoratorem pamięci podręcznej LRU i bez nich w następujący sposób:

Przykład 2: Program policz samogłoskę z ciągu

Policzamy liczbę samogłosek, jaki ma podany ciąg, wykorzystując dekorator LRU_CACHE.

z Functools import lru_cache
@Lru_Cache (MaxSize = 50)
def count_vowels (ciąg):
String = String.casefold ()
zwrócić sumę (ciąg.hrabia (samogłoska) dla samogłoski w „aeiou”)
print (Count_vowels („Hello Geeks”))

Najpierw dołączyliśmy LRU_Cache w naszym skrypcie, a następnie użyliśmy dekoratora LRU_CACHE. Wewnątrz dekoratora LRU_CACHE przekazaliśmy MaxSize jako argument i ustawiliśmy jego wartość na 50. Następnie utworzyliśmy funkcję o nazwie „count_vowels”, która przyjmuje zmienną „ciąg” jako wejście. Ustawiamy metodę CaseFold w zmiennej string. Metoda casefold tutaj przekształca znaki w dolną sprawę podaną w ciągu.

Następnie mamy polecenie powrotu, które podaje sumę samogłosek znalezionych w ciągu. Do instrukcji drukowania określliśmy ciąg „Hello Geeks”.

Poniżej znajduje się wartość liczb całkowita, która jest sumą samogłoski znalezionej w ciągu:

Wniosek

Omówiliśmy LRU_Cache w Pythonie jego składnią i przykładami. Wyjście i parametry są zapisywane, gdy wywoływana jest funkcja zamknięta w LRU_Cache. Funkcja jest następnie wywoływana ponownie, a jeśli znaleziono to samo wejście, dane wyjściowe z poprzedniego połączenia są zwracane bez wykonywania jakichkolwiek obliczeń.