functools: lru_cache dan cached_property
Simpan hasil komputasi mahal dalam cache dengan lru_cache dan cached_property.
functools: lru_cache dan cached_property adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Apa Itu Memoisasi?
Memoisasi menyimpan hasil pemanggilan fungsi dalam tembolok berdasarkan argumennya. Pemanggilan berulang dengan argumen yang sama mengembalikan hasil yang tersimpan seketika.
def slow_fib(n):
if n < 2: return n
return slow_fib(n-1) + slow_fib(n-2)
# slow_fib(35) makes ~29 million calls
# With caching it makes only 35@lru_cache
@functools.lru_cache(maxsize=128) menyimpan hingga maxsize hasil terbaru dalam tembolok. Atur maxsize=None untuk tembolok tanpa batas.
import functools
@functools.lru_cache(maxsize=None)
def fib(n):
if n < 2: return n
return fib(n-1) + fib(n-2)
print(fib(50)) # instant@cache — Python 3.9+
functools.cache adalah bentuk singkat dari lru_cache(maxsize=None) — tembolok tanpa batas dengan nama yang lebih sederhana.
import functools
@functools.cache
def factorial(n):
return n * factorial(n-1) if n else 1
print(factorial(10)) # 3628800Informasi dan Penghapusan Tembolok
Fungsi yang menggunakan tembolok menyediakan .cache_info() (hit, miss, ukuran) dan .cache_clear().
import functools
@functools.lru_cache(maxsize=100)
def square(n):
return n * n
for i in range(5): square(i % 3)
print(square.cache_info())
# CacheInfo(hits=2, misses=3, maxsize=100, currsize=3)
square.cache_clear()Kebijakan Pengeluaran LRU
LRU (Least Recently Used) mengeluarkan item yang paling lama tidak diakses saat tembolok penuh.
import functools
@functools.lru_cache(maxsize=3)
def compute(n):
print(f"computing {n}")
return n**2
for x in [1,2,3,4,1]: # 4 evicts 1 (LRU), then 1 re-computes
compute(x)Hanya Argumen yang Dapat Di-hash
lru_cache mengharuskan semua argumen dapat di-hash. Daftar dan kamus tidak dapat di-hash; gunakan tupel sebagai gantinya.
import functools
@functools.lru_cache(maxsize=None)
def sum_tuple(t): # tuple is hashable
return sum(t)
print(sum_tuple((1,2,3))) # 6
# sum_tuple([1,2,3]) # TypeError@cached_property
functools.cached_property menghitung sebuah properti sekali dan menyimpan hasilnya pada instans, menggantikan deskriptor dengan nilainya.
import functools
class Circle:
def __init__(self, r):
self.r = r
@functools.cached_property
def area(self):
import math
print("computing...")
return math.pi * self.r ** 2
c = Circle(5)
print(c.area) # computing... 78.53...
print(c.area) # 78.53... (cached, no print)cached_property vs property
@property menghitung ulang pada setiap akses. @cached_property menghitung sekali dan menyimpan hasilnya di instance.__dict__.
import functools
class Expensive:
@property
def always(self): # runs every access
return sum(range(1_000_000))
@functools.cached_property
def once(self): # runs only first access
return sum(range(1_000_000))Keamanan Utas cached_property
cached_property tidak aman untuk digunakan oleh banyak utas. Jika beberapa utas mengaksesnya secara bersamaan, perhitungan dapat dijalankan lebih dari sekali. Gunakan kunci jika diperlukan.
import functools, threading
class SafeCache:
_lock = threading.Lock()
@functools.cached_property
def data(self):
with self._lock:
return expensive_computation()Membatalkan Tembolok cached_property
Hapus atribut instans untuk membatalkan tembolok dan memaksa penghitungan ulang pada akses berikutnya.
import functools
class Report:
@functools.cached_property
def summary(self):
return compute_summary()
r = Report()
_ = r.summary # computed
del r.summary # invalidate
_ = r.summary # recomputedMenggunakan lru_cache sebagai Tembolok API
Simpan respons API dalam tembolok selama satu sesi untuk menghindari panggilan jaringan yang berulang. Hapus tembolok saat data terbaru diperlukan.
import functools, urllib.request, json
@functools.lru_cache(maxsize=32)
def get_user(user_id):
url = f"https://api.example.com/users/{user_id}"
with urllib.request.urlopen(url) as r:
return json.loads(r.read())
user = get_user(42) # network call
user = get_user(42) # cachedPemeriksaan Cepat
Metode apa yang menghapus semua hasil yang tersimpan dalam tembolok dari fungsi yang dihiasi dengan @lru_cache?
Ringkasan
@lru_cache menyimpan hasil fungsi berdasarkan argumen (yang harus dapat di-hash). @cache adalah alias tanpa batas. @cached_property menyimpan hasil penghitungan properti untuk setiap instans. Periksa dengan cache_info() dan atur ulang dengan cache_clear().
Pertanyaan yang Sering Diajukan
Apakah pelajaran “functools: lru_cache dan cached_property” gratis?
Ya — teks lengkap “functools: lru_cache dan cached_property” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “functools: lru_cache dan cached_property”?
Simpan hasil komputasi mahal dalam cache dengan lru_cache dan cached_property. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “functools: lru_cache dan cached_property” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- itertools: Iterator Tak Terbatas dan Terbatas
- itertools: Kombinatorika
- functools: partial dan reduce
- functools: lru_cache dan cached_property