Len (text.split ())) più veloce di text.count ("")?E perché così?pitone
-
21-12-2019 - |
Domanda
Dato che ho 1.000.000.000.000 di linee di ~ 20-100 gettoni per linea delimitati da spazi bianchi, contando la lunghezza di ciascuna linea diventa un tipo di non-trival.
Supponendo che non ci siano mai doppie spazi bianchi tra due token,
- .
-
è
len(text.split())
più veloce ditext.count(" ")+1
? -
E perché così?
Soluzione
Facile da verificare che è più veloce:
>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
è più lento, probabilmente perché costruisce l'elenco di spunti.
Altri suggerimenti
text.count(" ")
è sbagliato, vedere sotto:
In [706]: t='a b c'
In [707]: t.split()
Out[707]: ['a', 'b', 'c']
In [708]: t.count(' ')
Out[708]: 6
.
Non vuoi ottenere 6 in questo caso.
La tua premessa non è corretta.Entrambe quelle operazioni non forniscono gli stessi risultati, consente di utilizzare la tua domanda come esempio:
>>> 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
.
Dato la tua domanda di "Contando la lunghezza di ogni linea" Nessuna di queste operazioni lo fa ancora.
Per contare ogni riga devi fare:
line_lengths = [len(line) for line in text.splitlines()]
.
Ma probabilmente sarebbe meglio notare anche il numero della linea:
line_lengths = [(idx, len(line)) for idx, line in enumerate(text.splitlines())]
.