Подобные вопросы были принесены (хорошее сравнение скорости там) на этом том же предмете. Надо надеяться, этот вопрос отличается и обновляется от Python 2.6 и 3.0.
До сих пор я полагаю, что более быстрый и самый совместимый метод (среди различных версий Python) является простой плоскостью +
знак:
text = "whatever" + " you " + SAY
Но я продолжаю слышать, и читать это не безопасно и / или желательно.
Я даже не уверен, сколько методы там для управления строками! Я мог считать только приблизительно 4: существует интерполяция и все ее подопции такой как %
и format
и затем существуют простые, join
и +
.
Наконец, новый подход для строкового представления форматирования, которое является с format
, конечно, не хорошо для назад совместимости в то же время, делая %
не хороший для прямой совместимости. Но это должно использоваться для каждой обработки строк, включая каждую конкатенацию, каждый раз, когда мы ограничиваем нас 3.x только?
Ну, возможно, это - больше Wiki, чем вопрос, но я действительно хочу иметь ответ, на котором надлежащее использование каждого метода обработки строк. И какой мог обычно использоваться с каждым фокусом в памяти (лучше всего все вокруг для совместимости для скорости и для безопасности).
Спасибо.
править: Я не уверен, что должен принять ответ, если я не чувствую, что он действительно отвечает на вопрос... Но моя точка - то, что все их 3 вместе делают надлежащее задание.
Наиболее проголосовавший ответ Daniel является на самом деле тем, который я предпочел бы для принятия, если бы не "примечание". Я высоко не соглашаюсь с "конкатенацией, строго использует + оператор для конкатенации строк" потому что, со своей стороны, join
делает конкатенацию строк также, и мы можем создать любую произвольную библиотеку для этого.
Все текущие 3 ответа ценны, и я быть бы, имея некоторый ответ, смешивающий их всех. В то время как никто не добровольно предлагает делать это, я предполагаю путем выбора менее проголосовавшего того (но справедливо более широкий, чем THC4K, который больше похож на большой и очень встречаемый с одобрением комментарий), я могу привлечь внимание другим также.
Использование +
нормально, но не в том случае, если оно автоматизировано:
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
Хотите ли вы генерировать исключение или тихо делать что-то необычное, зависит от вашего использовать.
В качестве примечания : На самом деле речь идет о построении строки , а не о конкатенации как таковой, поскольку конкатенация строго использует оператор +
для объединения строк одну за другой. другой.
+
(конкатенация) - обычно неэффективно, но может быть проще для чтения для некоторых людей, используйте только тогда, когда удобочитаемость является приоритетом, а производительность нет (простые сценарии, одноразовые сценарии, код, не требующий высокой производительности) join
(построение строки из последовательности строк) - используйте это, если у вас есть последовательность строк, которую нужно соединить с помощью общего символа (или вообще без символа, если вы хотите использовать пустая строка ''
для присоединения) %
и формат
(интерполяция) - в основном каждая другая операция должна использовать то, что подходит, выберите какой оператор / функция подходит в зависимости от того, какую версию Python вы хотите поддерживать в течение всего времени существования кода (используйте %
для 2.x и формат
для 3.x) Проблема с +
для строк - это то же самое, что и во многих других языках: каждый раз, когда вы расширяете строку, она копируется. Итак, чтобы построить одну строку из 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