Como extrair o máximo de uma linha única 🧠

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