Скорость по сравнению с безопасностью по сравнению с совместимостью по методам, чтобы сделать конкатенацию строк в Python

Подобные вопросы были принесены (хорошее сравнение скорости там) на этом том же предмете. Надо надеяться, этот вопрос отличается и обновляется от Python 2.6 и 3.0.

До сих пор я полагаю, что более быстрый и самый совместимый метод (среди различных версий Python) является простой плоскостью + знак:

text = "whatever" + " you " + SAY

Но я продолжаю слышать, и читать это не безопасно и / или желательно.

Я даже не уверен, сколько методы там для управления строками! Я мог считать только приблизительно 4: существует интерполяция и все ее подопции такой как % и format и затем существуют простые, join и +.

Наконец, новый подход для строкового представления форматирования, которое является с format, конечно, не хорошо для назад совместимости в то же время, делая % не хороший для прямой совместимости. Но это должно использоваться для каждой обработки строк, включая каждую конкатенацию, каждый раз, когда мы ограничиваем нас 3.x только?

Ну, возможно, это - больше Wiki, чем вопрос, но я действительно хочу иметь ответ, на котором надлежащее использование каждого метода обработки строк. И какой мог обычно использоваться с каждым фокусом в памяти (лучше всего все вокруг для совместимости для скорости и для безопасности).

Спасибо.

править: Я не уверен, что должен принять ответ, если я не чувствую, что он действительно отвечает на вопрос... Но моя точка - то, что все их 3 вместе делают надлежащее задание.

Наиболее проголосовавший ответ Daniel является на самом деле тем, который я предпочел бы для принятия, если бы не "примечание". Я высоко не соглашаюсь с "конкатенацией, строго использует + оператор для конкатенации строк" потому что, со своей стороны, join делает конкатенацию строк также, и мы можем создать любую произвольную библиотеку для этого.

Все текущие 3 ответа ценны, и я быть бы, имея некоторый ответ, смешивающий их всех. В то время как никто не добровольно предлагает делать это, я предполагаю путем выбора менее проголосовавшего того (но справедливо более широкий, чем THC4K, который больше похож на большой и очень встречаемый с одобрением комментарий), я могу привлечь внимание другим также.

7
задан Community 23 May 2017 в 12:01
поделиться

3 ответа

Использование + нормально, но не в том случае, если оно автоматизировано:

a + small + number + of + strings + "is pretty fast"

, но это может быть очень медленным:

s = ''
for line in anything:
   s += line 

Используйте вместо этого:

s = ''.join([line for line in anything])

Есть плюсы и минусы использования + vs '% s% line' - использование + здесь не сработает:

s = 'Error - unexpected string' + 42

Хотите ли вы генерировать исключение или тихо делать что-то необычное, зависит от вашего использовать.

3
ответ дан 6 December 2019 в 21:11
поделиться

В качестве примечания : На самом деле речь идет о построении строки , а не о конкатенации как таковой, поскольку конкатенация строго использует оператор + для объединения строк одну за другой. другой.

  • + (конкатенация) - обычно неэффективно, но может быть проще для чтения для некоторых людей, используйте только тогда, когда удобочитаемость является приоритетом, а производительность нет (простые сценарии, одноразовые сценарии, код, не требующий высокой производительности)
  • join (построение строки из последовательности строк) - используйте это, если у вас есть последовательность строк, которую нужно соединить с помощью общего символа (или вообще без символа, если вы хотите использовать пустая строка '' для присоединения)
  • % и формат (интерполяция) - в основном каждая другая операция должна использовать то, что подходит, выберите какой оператор / функция подходит в зависимости от того, какую версию Python вы хотите поддерживать в течение всего времени существования кода (используйте % для 2.x и формат для 3.x)
5
ответ дан 6 December 2019 в 21:11
поделиться

Проблема с + для строк - это то же самое, что и во многих других языках: каждый раз, когда вы расширяете строку, она копируется. Итак, чтобы построить одну строку из 100 подстрок, Python копирует каждый из 99 шагов.

И это займет некоторое время:

# join 100 pretty short strings
python -m timeit -s "s = ['pretty short'] * 100" "t = ''.join(s)"
100000 loops, best of 3: 4.18 usec per loop

# same thing, 6 times slower
python -m timeit -s "s = ['pretty short'] * 100" "t = ''" "for x in s:" " t+=x"
10000 loops, best of 3: 30 usec per loop
4
ответ дан 6 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: