Ada apa dengan menghitung nol?
Insting dasar kebanyakan orang adalah menulis list comprehension:
max([len(i) for i in s.split('1')])Itu akan berfungsi. Tapi Anda pertama-tama memisahkan string (membuat list di memori), lalu melakukan loop untuk membuat list lain berisi bilangan bulat, untuk diberikan ke
max(). Pemborosan memori ganda tanpa alasan.Tapi bisa juga generator:
max((len(chunk) for chunk in s.split('1')))Dari segi memori, ini bagus — tidak ada list panjang perantara yang dibuat. Namun dari segi kecepatan, ekspresi generator di dalam fungsi bawaan Python berjalan lebih lambat karena overhead iterasi dan pemanggilan fungsi di tingkat bytecode.
Yang ini lebih baik:
max(map(len, s.split('1')))Kita menghilangkan loop Python.
map diimplementasikan dalam C, lazy, cepat, dan tidak boros memori. Kebanyakan orang berhenti di sini dengan senang.Tapi... ini juga belum optimal. Tanyakan pada diri sendiri: mengapa kita menghitung panjang semua potongan sebelum menemukan yang maksimal?
String di Python dibandingkan secara leksikografis. Karakter demi karakter. Akibatnya, string
"000" selalu lebih besar dari "00". Kita sebenarnya tidak perlu menghitung panjang substring untuk perbandingan.Harusnya begini!
len(max(s.split('1')))Mengapa ini solusi terbaik? 🤔
1. Pemanggilan
s.split('1') langsung mengembalikan list string.2.
max() memakan list ini dan membandingkan string itu sendiri di level C. Tidak ada map, tidak ada pemanggilan len untuk setiap elemen, tidak ada pemanggilan fungsi dalam loop.3. Kita memanggil
len() tepat satu kali — dari string pemenang.Semakin sedikit gerakan interpreter = kode lebih cepat.
#algosobes
Komentar
0Belum ada komentar.
Masuk untuk ikut berdiskusi.