Кращий спосіб додавання рядка в строкової змінної є використання +
або +=
. Це тому, що воно читабельне та швидке. Вони також настільки ж швидкі, який ви обираєте - це питання смаку, останній - найпоширеніший. Ось таймінги з 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
Ой. Виходить навіть у цьому випадку додавання / з'єднання відбувається повільніше.
То звідки береться ця рекомендація? Python 2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
Ну, додавання / приєднання там незначно швидше, якщо ви використовуєте надзвичайно довгі рядки (яких ви зазвичай не є.
Але справжній клінік - Python 2.3. Де я навіть не показуватиму вам терміни, тому що це так повільно, що ще не закінчилося. Ці випробування раптом займають хвилини . За винятком додавання / з'єднання, яке відбувається так само швидко, як і пізніші пітони.
Так. Сполучення струн у Python було дуже повільним ще в кам'яну епоху. Але на 2.4 це вже не є (або принаймні Python 2.4.7), тому рекомендація щодо використання додавання / приєднання застаріла в 2008 році, коли Python 2.3 перестав оновлюватись, і вам слід було б припинити його використання. :-)
(Оновлення: Виявляється, коли я тестування робив ретельніше, що використовує +
і +=
швидше для двох рядків на Python 2.3. Рекомендація щодо використання ''.join()
повинна бути непорозумінням)
Однак це CPython. Інші реалізації можуть мати інші проблеми. І це лише ще одна причина, чому передчасна оптимізація є коренем усього зла. Не використовуйте техніку, яка повинна бути "швидшою", якщо спочатку її не виміряєте.
Тому "найкращою" версією для з'єднання рядків є використання + або + = . І якщо це виявиться для вас повільним, що навряд чи, то зробіть щось інше.
То чому я використовую в своєму коді багато додавання / приєднання? Бо іноді насправді зрозуміліше. Особливо, коли все, що ви повинні об'єднати разом, слід розділяти пробілами, комами чи новими рядками.