Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Memanfaatkan __slot__ untuk Prestasi Lebih Baik dalam Kelas Python

Memanfaatkan __slot__ untuk Prestasi Lebih Baik dalam Kelas Python

王林
王林asal
2024-08-27 06:01:36545semak imbas

Setiap kali apabila kita mencipta python kelas baharu menyimpan setiap atribut dalam atribut dikt yang dipanggil kamus dinamik. Tingkah laku lalai ini nampaknya mudah, kerana ia fleksibel, tetapi apabila anda bekerja dengan sejumlah besar kejadian atau penggunaan memori adalah penting, maka overhed ini boleh menjadi penting.

Leveraging __slots__ for Better Performance in Python Classes

Bagaimanakah 'slot' berfungsi?

Python pada asasnya menggunakan kamus untuk menyimpan atribut kelas, tetapi salah satu alternatifnya ialah menggunakan slot. Dengan mentakrifkan nama ini, kami memberitahu Python untuk menggunakan struktur yang lebih statik dan padat yang mengurangkan penggunaan memori dengan ketara. Berikut ialah contoh asas cara menggunakan slot dalam kelas.

import sys 

class WithoutSlots:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class WithSlots:
    __slots__ = ['x', 'y']

    def __init__(self, x, y):
        self.x = x
        self.y = y

obj1 = WithoutSlots(1, 2)
obj2 = WithSlots(1, 2)

print(sys.getsizeof(obj1.__dict__)) # 296
print(sys.getsizeof(obj2)) # 48

Seperti yang ditunjukkan di atas 'TanpaSlots' menggunakan lebih banyak memori berbanding dengan 'WithSlots'. Fikirkan tentang membuat banyak contoh kelas - Pendekatan manakah yang menjadi pilihan yang lebih baik?

Leveraging __slots__ for Better Performance in Python Classes

Had

slot mungkin alat yang berguna, tetapi disertakan dengan pengehadan:

  • Tiada atribut dinamik: semasa mentakrifkan slot dalam badan kelas kami melumpuhkan atribut lalainya (dikt), jadi kami tidak boleh menambah atribut baharu secara dinamik pada contoh selepas ia dibuat.
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError

Kita boleh mengatasinya dengan menambahkan dikt pada slot.

  • Tiada warisan berbilang: setiap kelas asas mesti mengandungi slot ditakrifkan, jika tidak python akan kembali menggunakan kamus untuk menyimpan atribut instance.

  • Tiada nilai lalai: Anda perlu memulakan secara eksplisit nilai lalai secara eksplisit dalam kaedah init.

Leveraging __slots__ for Better Performance in Python Classes

Bila nak guna

Saya telah menulis beberapa contoh senario terbaik di mana kita boleh menggunakan slot:

  • Apabila kita mempunyai banyak contoh untuk dibuat dan penggunaan memori menjadi kebimbangan.
  • Apabila kita perlu mengoptimumkan prestasi.
  • Apabila anda mempunyai atribut yang diketahui dan tetap.
  • Apabila anda bekerja dengan set data yang besar.

Leveraging __slots__ for Better Performance in Python Classes

Fikiran akhir

Beginilah cara slot digunakan dalam Python: anda boleh menggunakannya apabila anda pasti anda tidak memerlukan sebarang atribut lain untuk kelas anda dan anda sedang bekerja dengannya sebilangan besar contoh. Dengan mentakrifkan slot, anda memberitahu Python untuk menggunakan struktur yang lebih cekap dan padat untuk menyimpan atribut, yang membantu menjimatkan memori. Ini amat berguna apabila penggunaan memori menjadi kebimbangan atau apabila anda perlu mengoptimumkan prestasi. Ingatlah bahawa dengan slot, anda tidak boleh menambah atribut baharu secara dinamik, jadi ia lebih baik digunakan apabila atribut kelas anda ditetapkan dan ditakrifkan dengan baik.

Atas ialah kandungan terperinci Memanfaatkan __slot__ untuk Prestasi Lebih Baik dalam Kelas Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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