Es len (texto.split ()) más rápido que el texto.count ("")?¿Y por qué así?pitón
-
21-12-2019 - |
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,
-
es
len(text.split())
más rápido quetext.count(" ")+1
? -
¿Y por qué, por lo tanto?
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())]