Не используйте оператор

Когда я только начал работать с Python, интуитивно стал использовать оператор + для объединения строк, как в Java и многих других языках программирования.

Однако вскоре я заметил, что многие разработчики предпочитают метод .join() оператору +. В этой статье я расскажу, чем отличаются эти подходы, и почему не стоит использовать +.

Вступление

Начинающему разработчику или разработчику, пришедшему из другого языка, в котором для объединения строк используется +, очень просто написать подобный код:

str1 = "I love "
str2 = "Python."

print(str1 + str2)

Но со временем вы обнаружите, что многие предпочитают использовать метод join():

str1 = "I love "
str2 = "Python."

print(''.join([str1, str2]))

Честно говоря, когда я столкнулся с этим методом впервые, я подумал, что он контринтуитивен и выглядит довольно неказисто.

Объединение нескольких строк

Впрочем, однажды мне понадобилось объединить несколько строк в списке.

strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']

Сначала я сделал это так:

strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']

def join_strs(strs):
    result = ''
    for s in strs:
        result += ' ' + s
    return result[1:]

join_strs(strs)

В этом примере я объединял строки одну за другой с помощью цикла for. Кроме того, в итоговой строке все строки должны были быть разделены пробелами, поэтому я добавил пробел перед всеми строками, кроме первой. Могут быть и другие решения — например, добавить индекс в цикл for, чтобы к нулевому индексу не добавлялся пробел. В любом случае необходимы цикл for и какое-то решение задачи добавления пробелов.

Потом я вспомнил про метод .join(). Возможно, настало время его испробовать!

Как же это просто! Одна строка кода делает всё, что нужно. Поскольку метод .join() вызывается строковым объектом, этот объект используется для объединения всех строк в списке, поэтому не нужно беспокоиться о пробеле в начале строки.

Но подождите, вы думаете, это единственный аргумент в пользу метода join()? Отнюдь нет. 

Логика метода join()

Теперь давайте сравним эти два метода с точки зрения производительности. Для оценки используем магический метод %timeit из Jupyter Notebook.

Производительность измерена для 100 тысяч циклов, поэтому результаты уверенные и очевидные. Для объединения строк в списке метод join() может быть в 4 раза быстрее, чем +.

Почему?

Вот концептуальная схема, которую я нарисовал, чтобы продемонстрировать подход с использованием оператора +.

Использование оператора “+” и цикла for для объединения строк в списке

Рассмотрим, что делают цикл for и оператор +:

  1. Для каждого цикла строка ищется в списке.
  2. Управляющая программа Python интерпретирует выражение result += ' ' + s и обращается за адресом памяти для пробела ' '.
  3. Затем управляющая программа понимает, что пробел нужно объединять со строкой, поэтому она обращается за адресом памяти для строки s (“Life” в первом цикле).
  4. Для каждого цикла управляющей программе приходится дважды обращаться за адресом памяти: сначала для пробелов, потом для строки.
  5. В итоге выделение памяти происходит 12 раз.

Что же происходит при использовании метода join()?

Использование метода “join()” для объединения строк в списке
  1. Управляющая программа считает строки, в данном примере их 6.
  2. Это означает, что строку, используемую для объединения, нужно повторить 6-1=5 раз.
  3. Программа знает, что нужно 11 областей в памяти, поэтому все они применяются одновременно и размещаются заранее.
  4. Строки расставляются по порядку, выдаётся результат.

Следовательно, основной причиной разницы в производительности является количество обращений к памяти.

Задумайтесь, раз для объединения 6 строк метод join() в 4 раза быстрее, что произойдёт при объединении куда большего числа строк? Разница будет иметь существенное значение.

Итог

В этой короткой статье я сравнил применение оператора + и метода join() для объединения строк в Python. Кажется, метод join() предпочтительнее благодаря своей производительности.

Изучение языка программирования предполагает довольно долгий путь, но Python делает его относительно короче для новичков. Однако не стоит останавливаться на том, как вы уже умеете использовать Python. Как правило разница между мастером и обычным разработчиком заключается в более глубоком понимании деталей. Не переставайте искать новые подходы на пути к мастерству. 

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Christopher Tao: Do Not Use “+” to Join Strings in Python