Является ли len(text.split()) быстрее, чем text.count(" ")? А почему так? питон

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

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

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

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

3 ответа

Решение

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

>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())]
Другие вопросы по тегам