Pregunta

Dado que tengo 1,000,000,000 de líneas de ~ 20-100 fichas por línea delimitadas por espacios en blanco, contando la longitud de cada línea se convierte en una especie de no trivial.

Suponiendo que nunca hay espacios en blanco dobles entre dos tokens,

  1. es len(text.split()) más rápido que text.count(" ")+1?

  2. ¿Y por qué, por lo tanto?

¿Fue útil?

Solución

fácil de comprobar cuál es más 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 es más lento, probablemente porque construye la lista dividida.

Otros consejos

text.count(" ") está incorrecto, vea a continuación:

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

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

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

No quieres obtener 6 en este caso.

Su premisa es incorrecta.Ambas operaciones no dan los mismos resultados, vamos a usar su pregunta como ejemplo:

>>> 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 su pregunta de "contando la longitud de cada línea". Ninguna de esas operaciones ni siquiera lo hacen.

Para contar cada línea que necesita hacer:

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

Pero probablemente sería mejor también tener en cuenta el número de línea:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top