Masalah ini, bersembunyi selama 18 bulan, hanya muncul apabila pengguna menyimpang dari corak penggunaan yang disyorkan. Isu ini berpunca daripada rangka kerja Pembelajaran Mesin Custom (ML) (dibina di Scikit-learn) dalam organisasi saya. Rangka kerja ini mengakses pelbagai sumber data dengan kerap, yang memerlukan lapisan caching untuk prestasi dan pengoptimuman kos (mengurangkan kos egress bigquery).
Pada mulanya,
digunakan, tetapi cache berterusan diperlukan untuk data statik yang sering diakses semasa pembangunan. lru_cache
, perpustakaan python yang menggunakan SQLite, dipilih untuk kesederhanaan dan keserasiannya dengan persekitaran 32-proses kami dan data Pandas (sehingga 500MB). Lapisan DiskCache
ditambah di atas untuk akses dalam memori. lru_cache
standard pengekodan kami ditentukan membuat data baru selepas pemprosesan. Walau bagaimanapun, sesetengah pengguna, daripada kebiasaan, digunakan
, mengubah objek cache secara langsung. Ini bukan sahaja mengubah keputusan segera mereka tetapi juga merosakkan data cache, yang mempengaruhi permintaan berikutnya. inplace=True
<code class="language-python">from functools import lru_cache import time import typing as t from copy import deepcopy @lru_cache def expensive_func(keys: str, vals: t.Any) -> dict: time.sleep(3) return dict(zip(keys, vals)) def main(): e1 = expensive_func(('a', 'b', 'c'), (1, 2, 3)) print(e1) e2 = expensive_func(('a', 'b', 'c'), (1, 2, 3)) print(e2) e2['d'] = "amazing" print(e2) e3 = expensive_func(('a', 'b', 'c'), (1, 2, 3)) print(e3) if __name__ == "__main__": main()</code>
Menyediakan rujukan, bukan salinan. Mengubah lru_cache
mengubah data cache. e2
Penyelesaian:
Penyelesaiannya melibatkan kembali salinan objek cache yang mendalam:
<code class="language-python">from functools import lru_cache, wraps from copy import deepcopy def custom_cache(func): cached_func = lru_cache(func) @wraps(func) def _wrapper(*args, **kwargs): return deepcopy(cached_func(*args, **kwargs)) return _wrapper</code>
Takeaways utama:
lru_cache
Atas ialah kandungan terperinci Python Caching nilai boleh ubah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!