Лучший способ добавления строки в строковой переменной является использование +
или +=
. Это потому, что это читается и быстро. Они также такие же быстрые, какой из них вы выбираете - дело вкуса, последний является наиболее распространенным. Вот время с timeit
модулем:
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
Однако те, кто рекомендует иметь списки и добавлять к ним, а затем присоединяться к этим спискам, делают это, потому что добавление строки в список, по-видимому, очень быстро по сравнению с расширением строки. И это может быть правдой, в некоторых случаях. Вот, например, один миллион добавлений односимвольной строки, сначала в строку, затем в список:
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
Хорошо, получается, что даже когда длина получаемой строки составляет миллион символов, добавление все равно происходит быстрее.
Теперь давайте попробуем добавить строку длиной в тысячу символов сто тысяч раз:
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
Таким образом, длина конечной строки составляет около 100 МБ. Это было довольно медленно, добавление в список было намного быстрее. То, что это время не включает финал a.join()
. Так как долго это займет?
a.join(a):
0.43739795684814453
Oups. Оказывается, даже в этом случае, добавление / объединение происходит медленнее.
Так откуда эта рекомендация? Python 2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
Что ж, добавление / объединение происходит немного быстрее, если вы используете очень длинные строки (чего у вас обычно нет, что бы вы имели строку размером 100 МБ в памяти?)
Но настоящий довод - это Python 2.3. Там, где я даже не покажу вам время, потому что оно настолько медленное, что еще не закончено. Эти тесты внезапно занимают минуты . За исключением append / join, который так же быстр, как и при поздних Pythons.
Ага. Конкатенация строк в Python была очень медленной еще в каменном веке. Но на 2.4 он больше не существует (или, по крайней мере, на Python 2.4.7), поэтому рекомендация использовать append / join устарела в 2008 году, когда Python 2.3 перестал обновляться, и вы должны были прекратить его использование. :-)
(Обновление: оказывается, когда я проводил более тщательное тестирование, чем использование, +
и +=
оно быстрее для двух строк на Python 2.3. Рекомендации по использованию ''.join()
должны быть недопониманием)
Тем не менее, это CPython. Другие реализации могут иметь другие проблемы. И это еще одна причина, по которой преждевременная оптимизация является корнем всего зла. Не используйте технику, которая считается «более быстрой», если вы сначала не измерите ее.
Поэтому «лучшая» версия для объединения строк - использовать + или + = . И если это окажется для вас медленным, что маловероятно, то сделайте что-нибудь еще.
Итак, почему я использую много дополнений / соединений в моем коде? Потому что иногда это на самом деле понятнее. Особенно, когда все, что вы должны объединить вместе, должно быть разделено пробелами, запятыми или символами новой строки.