Является ли len(text.split()) быстрее, чем text.count(" ")? А почему так? питон
Учитывая, что у меня есть 1 000 000 000 строк по ~20-100 токенов на строку, разделенных пробелами, подсчет длины каждой строки становится своего рода нетривиальным.
Предполагая, что между двумя токенами никогда не бывает двойных пробелов,
Является
len(text.split())
быстрее, чемtext.count(" ")+1
?А почему так?
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())]