Kod ...
options.get(something, doThisMostOfTheTime)()
... daha hızlı olması gerekiyor gibi görünüyor, ama aslında if
... elif
... else
yapısından daha yavaştır , çünkü bir işlevi çağırmak zorundadır, bu da sıkı bir döngüde önemli bir performans yükü olabilir.
Şu örnekleri düşünün ...
1.py
something = 'something'
for i in xrange(1000000):
if something == 'this':
the_thing = 1
elif something == 'that':
the_thing = 2
elif something == 'there':
the_thing = 3
else:
the_thing = 4
2.py
something = 'something'
options = {'this': 1, 'that': 2, 'there': 3}
for i in xrange(1000000):
the_thing = options.get(something, 4)
3.py
something = 'something'
options = {'this': 1, 'that': 2, 'there': 3}
for i in xrange(1000000):
if something in options:
the_thing = options[something]
else:
the_thing = 4
4.py
from collections import defaultdict
something = 'something'
options = defaultdict(lambda: 4, {'this': 1, 'that': 2, 'there': 3})
for i in xrange(1000000):
the_thing = options[something]
... ve kullandıkları CPU süresini not edin ...
1.py: 160ms
2.py: 170ms
3.py: 110ms
4.py: 100ms
... kullanıcı zamanını kullanarak time(1)
.
Seçenek # 4, her farklı anahtar kaçırma için yeni bir öğe eklemek için ek bellek ek yüküne sahiptir, bu nedenle, sınırsız sayıda farklı anahtar kaçırma bekliyorsanız, seçenek # 3 ile devam ediyorum, bu hala önemli bir gelişme orijinal yapı.
sort
birinin eşleşeceği tüm unsurların bir ucunda, geri kalanın diğer ucunda olacağı şekilde eğer / değilse ... zincirinizi çalıştırdığınız şeyler olabilir mi ? Eğer öyleyse, bunun daha hızlı / daha zarif olup olmadığını görebilirsiniz. Ancak, performans sorunu yoksa optimizasyon konusunda endişelenmek için henüz çok erken olduğunu unutmayın.