Frage

Angesichts der Tatsache, dass ich 1.000.000.000 Zeilen mit ca. 20–100 Token pro Zeile habe, die durch Leerzeichen getrennt sind, ist das Zählen der Länge jeder Zeile nicht trivial.

Unter der Annahme, dass es zwischen zwei Token niemals doppelte Leerzeichen gibt,

  1. Ist len(text.split()) schneller als text.count(" ")+1?

  2. Und warum?

War es hilfreich?

Lösung

Einfach überprüfen, was schneller ist:

>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 ist langsamer, wahrscheinlich weil es die geteilte Liste erstellt.

Andere Tipps

text.count(" ") ist falsch, siehe unten:

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

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

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

In diesem Fall wollen Sie keine 6 bekommen.

Ihre Prämisse ist falsch.Beide Vorgänge liefern nicht die gleichen Ergebnisse. Nehmen wir Ihre Frage als Beispiel:

>>> 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

Angesichts Ihrer Frage, „die Länge jeder Zeile zu zählen“, führt keiner dieser Vorgänge dies überhaupt aus.

Um jede Zeile zu zählen, müssen Sie Folgendes tun:

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

Aber es wäre wahrscheinlich besser, auch die Zeilennummer zu notieren:

line_lengths = [(idx, len(line)) for idx, line in enumerate(text.splitlines())]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top