0Pricing
Python Academy · Pelajaran

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))  # 3628800

Informasi 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      # recomputed

Menggunakan 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)   # cached

Pemeriksaan 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

  1. itertools: Iterator Tak Terbatas dan Terbatas
  2. itertools: Kombinatorika
  3. functools: partial dan reduce
  4. functools: lru_cache dan cached_property
← Kembali ke Python Academy