Вопрос

Учитывая, что у меня есть 1 000 000 000 строк по ~ 20-100 токенов в каждой строке, разделенных пробелами, подсчет длины каждой строки становится своего рода нетривиальной задачей.

Предполагая, что между двумя токенами никогда не бывает двойных пробелов,

  1. Является len(text.split()) быстрее, чем text.count(" ")+1?

  2. И почему так?

Это было полезно?

Решение

Легко проверить, что быстрее:

>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 работает медленнее, вероятно, потому, что он создает разделенный список.

Другие советы

text.count(" ") неверно, см. ниже:

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

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

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

В этом случае вы не хотите получить 6.

Ваша предпосылка неверна.Обе эти операции не дают одинаковых результатов, давайте воспользуемся вашим вопросом в качестве примера:

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

Учитывая ваш вопрос о «подсчете длины каждой строки», ни одна из этих операций этого даже не делает.

Чтобы посчитать каждую строку, вам нужно сделать:

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

Но, вероятно, было бы лучше также отметить номер строки:

line_lengths = [(idx, len(line)) for idx, line in enumerate(text.splitlines())]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top