Bence her birinin kullanımı, benim buna giremeyecek kadar özneldir, bu yüzden sadece sayılara bağlı kalacağım.
Bir diktede bir değişken oluşturmak ve değiştirmek için gereken zamanı, bir new_style sınıfı ve slotlu bir new_style sınıfını karşılaştırdım.
İşte test etmek için kullandığım kod (biraz dağınık ama işi yapıyor.)
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')))
Ve işte çıktı ...
Oluşturuluyor ...
Dict: 0.817466186345
Class: 1.60829183597
Class_with_slots: 1.28776730003
Bir değişkeni değiştirme ...
Dict: 0.0735140918748
Class: 0.111714198313
Class_with_slots: 0.10618612142
Yani, sadece değişkenleri depoluyorsanız, hıza ihtiyacınız var ve çok fazla hesaplama yapmanızı gerektirmiyorsa, bir dikt kullanmanızı tavsiye ederim (her zaman sadece bir metoda benzeyen bir fonksiyon yapabilirsiniz). Ancak, gerçekten derslere ihtiyacınız varsa, unutmayın - her zaman __ yuva __ kullanın .
Not:
"Sınıf" ı hem new_style hem de old_style sınıflarıyla test ettim . Eski stil sınıflarının oluşturulması daha hızlı ancak değiştirilmesinin daha yavaş olduğu ortaya çıkıyor (sıkı bir döngüde çok sayıda sınıf oluşturuyorsanız önemli değil ama önemli (ipucu: yanlış yapıyorsunuz)).
Ayrıca benimki eski ve yavaş olduğu için, değişken oluşturma ve değiştirme zamanları bilgisayarınızda farklılık gösterebilir. 'Gerçek' sonuçları görmek için kendiniz test ettiğinizden emin olun.
Düzenle:
Daha sonra adlandırılmış grubu test ettim: onu değiştiremiyorum ama 10000 örnek (veya bunun gibi bir şey) oluşturmak için 1.4 saniye sürdü, bu yüzden sözlük gerçekten en hızlısı.
İ Eğer dict işlevini değiştirmek bunu oluştururken anahtarlarını ve değerlerini içerecek şekilde ve dicti içeren değişken yerine dicti dönmek için bana verir 0,65 yerine 0,8 saniye.
class Foo(dict):
pass
Yaratmak, yuvaları olan bir sınıfa benzer ve değişkeni değiştirmek en yavaş olanıdır (0.17 saniye), bu nedenle bu sınıfları kullanmayın . bir dikte (hız) veya nesneden türetilen sınıf ('sözdizimi şekeri') için gidin
dict
mantıklı olabilir. temiz avantaj: hata ayıkladığınızda, sadece söyleyinprint(request)
ve tüm durum bilgilerini kolayca göreceksiniz. daha klasik yaklaşımla, özel__str__
yöntemlerinizi yazmanız gerekecek, bu da her zaman yapmak zorunda kalırsanız berbattır.