Sıfır sayma işi ne durumda?
Çoğu kişinin temel içgüdüsü bir list comprehension yazmaktır:
max([len(i) for i in s.split('1')])Çalışacaktır. Ama önce dizgiyi böler (bellekte bir liste oluşturarak) ve sonra
max()'a beslemek için başka bir liste oluşturmak üzere üzerinde döngü yaparsınız. Boş yere çift bellek tüketimi.Ama bir jeneratör de kullanabilirsiniz:
max((len(chunk) for chunk in s.split('1')))Bellek açısından bu güzel — ara liste oluşturulmaz. Ancak hız açısından, Python'da yerleşik fonksiyonlar içindeki jeneratör ifadeleri, yineleme ve bayt kodu düzeyinde fonksiyon çağrıları nedeniyle daha yavaş çalışır.
Şöyle daha iyi:
max(map(len, s.split('1')))Python döngüsünden kurtuluruz.
map C'de uygulanmıştır, tembeldir, hızlı çalışır, bellek tüketmez. Çoğu kişi burada mutlu bir şekilde durur.Ama... bu da pek iyi değil. Kendinize şu soruyu sorun: Maksimumu bulmadan önce neden tüm parçaların uzunluklarını hesaplıyoruz?
Python'da dizgiler sözlükbilimsel olarak karşılaştırılır. Karakter karakter. Dolayısıyla,
"000" dizgisi her zaman "00"'dan büyüktür. Karşılaştırma için alt dizgilerin uzunluklarını hesaplamamıza hiç gerek yok.Şöyle yapmalıyız!
len(max(s.split('1')))Neden bu en iyi çözüm? 🤔
1.
s.split('1') çağrısı anında bir dizgi listesi döndürür.2.
max() bu listeyi alır ve C düzeyinde dizgileri karşılaştırır. map yok, her öğe için len çağrısı yok, döngüde fonksiyon çağrısı yok.3.
len()'i tam olarak bir kez — kazanan dizgiden alırız.Yorumlayıcının daha az hareketi = daha hızlı kod.
#algosöyleşi
Yorumlar
0Henüz yorum yok.