Saya pikir penggunaan masing-masing terlalu subyektif bagi saya untuk memahaminya, jadi saya akan tetap berpegang pada angka.
Saya membandingkan waktu yang dibutuhkan untuk membuat dan mengubah variabel dalam sebuah dict, kelas gaya_baru dan kelas gaya_baru dengan slot.
Inilah kode yang saya gunakan untuk mengujinya (agak berantakan tetapi berhasil.)
import timeit
class Foo(object):
def __init__(self):
self.foo1 = 'test'
self.foo2 = 'test'
self.foo3 = 'test'
def create_dict():
foo_dict = {}
foo_dict['foo1'] = 'test'
foo_dict['foo2'] = 'test'
foo_dict['foo3'] = 'test'
return foo_dict
class Bar(object):
__slots__ = ['foo1', 'foo2', 'foo3']
def __init__(self):
self.foo1 = 'test'
self.foo2 = 'test'
self.foo3 = 'test'
tmit = timeit.timeit
print 'Creating...\n'
print 'Dict: ' + str(tmit('create_dict()', 'from __main__ import create_dict'))
print 'Class: ' + str(tmit('Foo()', 'from __main__ import Foo'))
print 'Class with slots: ' + str(tmit('Bar()', 'from __main__ import Bar'))
print '\nChanging a variable...\n'
print 'Dict: ' + str((tmit('create_dict()[\'foo3\'] = "Changed"', 'from __main__ import create_dict') - tmit('create_dict()', 'from __main__ import create_dict')))
print 'Class: ' + str((tmit('Foo().foo3 = "Changed"', 'from __main__ import Foo') - tmit('Foo()', 'from __main__ import Foo')))
print 'Class with slots: ' + str((tmit('Bar().foo3 = "Changed"', 'from __main__ import Bar') - tmit('Bar()', 'from __main__ import Bar')))
Dan inilah hasilnya ...
Membuat ...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Mengubah variabel ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Jadi, jika Anda hanya menyimpan variabel, Anda memerlukan kecepatan, dan tidak mengharuskan Anda melakukan banyak perhitungan, saya sarankan menggunakan dict (Anda selalu bisa membuat fungsi yang terlihat seperti metode). Tetapi, jika Anda benar-benar membutuhkan kelas, ingat - selalu gunakan __ slot __ .
catatan:
Saya menguji 'Kelas' dengan kelas gaya_baru dan gaya_baru. Ternyata kelas old_style lebih cepat dibuat tetapi lebih lambat untuk dimodifikasi (tidak terlalu signifikan tetapi signifikan jika Anda membuat banyak kelas dalam putaran yang ketat (tip: Anda salah melakukannya)).
Juga waktu untuk membuat dan mengubah variabel mungkin berbeda di komputer Anda karena milik saya sudah tua dan lambat. Pastikan Anda mengujinya sendiri untuk melihat hasil 'nyata'.
Edit:
Saya kemudian menguji nametuple: saya tidak dapat memodifikasinya tetapi untuk membuat 10.000 sampel (atau sesuatu seperti itu) butuh 1,4 detik sehingga kamus memang yang tercepat.
Jika saya mengubah fungsi dict untuk memasukkan kunci dan nilai dan mengembalikan dict alih-alih variabel yang berisi dict ketika saya membuatnya, itu memberi saya 0,65 daripada 0,8 detik.
class Foo(dict):
pass
Membuat seperti kelas dengan slot dan mengubah variabel paling lambat (0,17 detik) jadi jangan gunakan kelas ini . gunakan dict (kecepatan) atau untuk kelas yang diturunkan dari objek ('syntax candy')
dict
bisa masuk akal, hingga. keuntungan rapi: ketika Anda men-debug, katakan sajaprint(request)
dan Anda akan segera melihat semua informasi status. dengan pendekatan yang lebih klasik Anda harus menulis__str__
metode kustom Anda , yang menyebalkan jika Anda harus melakukannya sepanjang waktu.