Rumah > pembangunan bahagian belakang > Tutorial Python > Python Caching nilai boleh ubah

Python Caching nilai boleh ubah

Barbara Streisand
Lepaskan: 2025-01-26 16:13:10
asal
926 orang telah melayarinya

Python Caching mutable values

caching secara dramatik mempercepatkan pemprosesan, dari operasi peringkat CPU ke antara muka pangkalan data. Pembatalan cache -menetap ketika untuk mengeluarkan data cache -adalah cabaran yang kompleks. Siaran ini menangani masalah yang lebih mudah, namun berbahaya,.

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

Masalahnya muncul apabila lebih ramai pengguna bereksperimen dengan rangka kerja. Keputusan yang tidak betul secara rawak dilaporkan, sukar untuk menghasilkan semula secara konsisten. Punca Akar: Pengubahsuaian di tempat data Pandas yang di-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

untuk menggambarkan, pertimbangkan contoh mudah ini menggunakan kamus:

<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>
Salin selepas log masuk

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>
Salin selepas log masuk
Ini menambah overhead kecil (duplikasi data), tetapi menghalang rasuah data.

Takeaways utama:

    pemahaman yang lebih mendalam tentang tingkah laku rujukan
  • . lru_cache
  • mematuhi piawaian pengekodan meminimumkan pepijat.
  • Akaun untuk penyimpangan pengguna dari amalan terbaik dalam pelaksanaan. Kekukuhan sering mengalahkan keanggunan.

Atas ialah kandungan terperinci Python Caching nilai boleh ubah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan