O que acontece com a contagem de zeros?
O instinto básico da maioria é escrever uma list comprehension:
max([len(i) for i in s.split('1')])Funcionará. Mas primeiro você divide a string (criando uma lista na memória) e depois percorre um loop para criar outra lista de inteiros para alimentar
max(). Dobro de consumo de memória à toa.Mas também pode usar um generator:
max((len(chunk) for chunk in s.split('1')))Em termos de memória, isso é bonito — a lista intermediária de comprimentos não é criada. Mas em velocidade, expressões geradoras dentro de funções embutidas em Python são mais lentas devido à sobrecarga de iteração e chamadas de função no nível de bytecode.
E assim é ainda melhor:
max(map(len, s.split('1')))Eliminamos o loop Python.
map é implementado em C, é lazy, funciona rápido, não consome memória. A maioria fica feliz com isso.Mas... isso também não é ótimo. Pergunte-se: por que estamos contando os comprimentos de todos os pedaços antes de encontrar o máximo?
Strings em Python são comparadas lexicograficamente. Caractere por caractere. Consequentemente, a string
"000" é sempre maior que "00". Nem precisamos calcular os comprimentos das substrings para comparar.Assim é melhor!
len(max(s.split('1')))Por que esta é a melhor solução? 🤔
1. A chamada
s.split('1') retorna imediatamente uma lista de strings.2.
max() consome essa lista e compara as próprias strings em nível C. Nada de map, nada de chamadas len para cada elemento, nada de chamadas de função em loop.3. Chamamos
len() exatamente uma vez — na string vencedora.Menos movimentos do interpretador = código mais rápido.
#algosobes
Comentários
0Ainda não há comentários.
Entre para participar da conversa.