Pergunta

Dado que tenho 1.000.000.000 de linhas de aproximadamente 20-100 tokens por linha delimitadas por espaços em branco, contar o comprimento de cada linha torna-se algo não trivial.

Supondo que nunca haja espaços em branco duplos entre dois tokens,

  1. É len(text.split()) mais rápido que text.count(" ")+1?

  2. E por que isso?

Foi útil?

Solução

Fácil de verificar o que é mais rápido:

>python -m timeit -s "s='q w e r t y u i o p a s d f g h j k l'" "s.count(' ')+1"
1000000 loops, best of 3: 0.272 usec per loop

>python -m timeit -s "s='q w e r t y u i o p a s d f g h j k l'" "len(s.split())"
1000000 loops, best of 3: 0.653 usec per loop

split é mais lento, provavelmente porque constrói a lista dividida.

Outras dicas

text.count(" ") está errado, veja abaixo:

In [706]: t='a  b    c'

In [707]: t.split()
Out[707]: ['a', 'b', 'c']

In [708]: t.count(' ')
Out[708]: 6

Você não quer obter 6 neste caso.

Sua premissa está incorreta.Ambas as operações não dão os mesmos resultados, vamos usar sua pergunta como exemplo:

>>> text = "Given that I have 1,000,000,000 lines of ~20-100 tokens per line delimited by whitespace, counting the length of each line becomes sort of non-trival."
>>> len(text.split())
24
>>> text.count(" ")
23

Dada a sua questão de "contar o comprimento de cada linha", nenhuma dessas operações faz isso.

Para contar cada linha você precisa fazer:

line_lengths = [len(line) for line in text.splitlines()]

Mas provavelmente seria melhor anotar também o número da linha:

line_lengths = [(idx, len(line)) for idx, line in enumerate(text.splitlines())]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top