Поскольку Python не string
может быть изменен, мне было интересно, как объединить строку более эффективно?
Я могу написать так:
s += stringfromelsewhere
или вот так:
s = []
s.append(somestring)
later
s = ''.join(s)
Во время написания этого вопроса я нашел хорошую статью, рассказывающую о теме.
http://www.skymind.com/~ocrow/python_string/
Но это в Python 2.x., поэтому вопрос будет что-то изменить в Python 3?
python
string
python-3.x
concat
Максимум
источник
источник
Ответы:
Лучший способ добавления строки в строковой переменной является использование
+
или+=
. Это потому, что это читается и быстро. Они также такие же быстрые, какой из них вы выбираете - дело вкуса, последний является наиболее распространенным. Вот время сtimeit
модулем:Однако те, кто рекомендует иметь списки и добавлять к ним, а затем присоединяться к этим спискам, делают это, потому что добавление строки в список, по-видимому, очень быстро по сравнению с расширением строки. И это может быть правдой, в некоторых случаях. Вот, например, один миллион добавлений односимвольной строки, сначала в строку, затем в список:
Хорошо, получается, что даже когда длина получаемой строки составляет миллион символов, добавление все равно происходит быстрее.
Теперь давайте попробуем добавить строку длиной в тысячу символов сто тысяч раз:
Таким образом, длина конечной строки составляет около 100 МБ. Это было довольно медленно, добавление в список было намного быстрее. То, что это время не включает финал
a.join()
. Так как долго это займет?Oups. Оказывается, даже в этом случае, добавление / объединение происходит медленнее.
Так откуда эта рекомендация? Python 2?
Что ж, добавление / объединение происходит немного быстрее, если вы используете очень длинные строки (чего у вас обычно нет, что бы вы имели строку размером 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. Другие реализации могут иметь другие проблемы. И это еще одна причина, по которой преждевременная оптимизация является корнем всего зла. Не используйте технику, которая считается «более быстрой», если вы сначала не измерите ее.
Поэтому «лучшая» версия для объединения строк - использовать + или + = . И если это окажется для вас медленным, что маловероятно, то сделайте что-нибудь еще.
Итак, почему я использую много дополнений / соединений в моем коде? Потому что иногда это на самом деле понятнее. Особенно, когда все, что вы должны объединить вместе, должно быть разделено пробелами, запятыми или символами новой строки.
источник
Если вы объединяете много значений, то ни того, ни другого. Добавление списка стоит дорого. Вы можете использовать StringIO для этого. Особенно, если вы строите это за много операций.
Если у вас уже есть полный список, возвращенный вам из какой-либо другой операции, просто используйте
''.join(aList)
Из часто задаваемых вопросов по Python: Каков наиболее эффективный способ объединения многих строк вместе?
Изменить: я был глуп, и результаты были вставлены в обратном направлении, так что добавление в список было быстрее, чем cStringIO. Я также добавил тесты для bytearray / str concat, а также второй раунд тестов с использованием большего списка с более крупными строками. (Python 2.7.3)
Тестовый пример ipython для больших списков строк
источник
cStringIO
не существует в Py3. Используйтеio.StringIO
вместо этого.В Python> = 3.6 новая f-строка является эффективным способом объединения строки.
источник
Рекомендуемый метод по-прежнему использовать добавление и присоединение.
источник
Если объединяемые строки являются литералами, используйте конкатенацию литералов String.
Это полезно, если вы хотите прокомментировать часть строки (как указано выше) или если вы хотите использовать необработанные строки или тройные кавычки для части литерала, но не для всех.
Поскольку это происходит на уровне синтаксиса, в нем используются операторы с нулевым сцеплением.
источник
Вы пишете эту функцию
Тогда вы можете просто позвонить куда хотите
источник
str_join = lambda *str_list: ''.join(s for s in str_list)
Использование конкатенации строк вместо '+' является НАИЛУЧШИМ методом конкатенации с точки зрения стабильности и перекрестной реализации, поскольку он не поддерживает все значения. Стандарт PEP8 препятствует этому и поощряет использование format (), join () и append () для долгосрочного использования.
Как указано в связанном разделе «Рекомендации по программированию»:
источник
В то время как несколько устарели, код Словно Pythonista: Идиоматический Python рекомендует
join()
более+
в этом разделе . Как и PythonSpeedPerformanceTips в своем разделе о конкатенации строк со следующим отказом от ответственности:источник
Как упоминает @jdi, документация по Python предлагает использовать
str.join
илиio.StringIO
для конкатенации строк. И говорит, что разработчик должен ожидать квадратичного времени+=
в цикле, даже несмотря на оптимизацию, начиная с Python 2.4. Как этот ответ говорит:Я покажу пример реального кода, который наивно полагался на
+=
эту оптимизацию, но она не применялась. Приведенный ниже код преобразует итерируемые короткие строки в большие куски для использования в массовом API.Этот код может работать в течение нескольких часов из-за квадратичной сложности времени. Ниже приведены альтернативы с предлагаемыми структурами данных:
И микро-тест:
источник
Вы можете сделать по-разному.
Я создал это небольшое резюме в следующих статьях.
источник
Мой случай использования был немного другим. Мне пришлось построить запрос, где более 20 полей были динамическими. Я придерживался этого подхода использования метода форматирования
это было сравнительно проще для меня вместо использования + или других способов
источник
Вы можете использовать это (более эффективно) тоже. ( /software/304445/why-is-s-better-than-for-concatenation )
источник