Не використовуйте оператор "+" для об'єднання рядків в Python

Alex Alex 09 листопада
Не використовуйте оператор "+" для об'єднання рядків в Python

Коли я тільки почав працювати з Python, я інтуїтивно почав використовувати оператор + для об'єднання рядків, як в Java і багатьох інших мовах програмування.

Однак незабаром я помітив, що багато розробників надають перевагу методу .join() а не оператору +. У цій статті я розповім, чим відрізняються ці підходи, і чому не варто використовувати +.

Вступ

Початківець або розробник який прийшов з іншої мови, в якій для об'єднання рядків використовується +, може легко написати подібний код:

str1 = "I love " 
str2 = "Python."
print (str1 + str2)
Image for post

Але з часом ви виявите, що багато хто воліє використовувати метод join():

str1 = "I love" 
str2 = "Python."
print ( ''. join ([str1, str2]))
Image for post

Чесно кажучи, коли я зіткнувся з цим методом вперше, я подумав, що він контрінтуїтивний і виглядає якось повторно.

Об'єднання декількох рядків

Однак, одного разу мені знадобилося об'єднати кілька рядків у списку.

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)
Image for post

У цьому прикладі я об'єднував рядки один за одним за допомогою циклу for. Крім того, в підсумковому рядку всі рядки треба було розділити пробілами, тому я додав пробіл перед усіма рядками, крім першого. Можуть бути й інші рішення - наприклад, додати індекс в цикл for, щоб до нульового індексу не додавати пробіл. У будь-якому випадку необхідний цикл for і якесь рішення для додавання пробілів.

Потім я згадав про метод .join(). Можливо, настав час його випробувати!

Image for post

Як же це просто! Один рядок коду робить все, що потрібно. Оскільки метод .join() викликається строковим об'єктом, цей об'єкт використовується для об'єднання всіх рядків у списку, тому не потрібно турбуватися про пробіл на початку рядка.

Але почекайте, ви думаєте, це єдиний аргумент на користь методу join()? Зовсім ні.

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

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

Image for post

Продуктивність виміряна для 100 тисяч циклів, тому результати впевнені та очевидні. Об'єднання рядків у списку методом join() може бути в 4 рази швидшим, ніж +.

Чому?

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

Image for post
Використання оператора "+" і циклу for для об'єднання рядків у списку

Розглянемо, що роблять цикл for і оператор +:

  1. Для кожного циклу рядок шукається в списку.
  2. Керуюча програма Python інтерпретує вираз result += ' ' + s і звертається за адресою пам'яті для пробілу ' '.
  3. Далі керуюча програма розуміє, що пробіл потрібно об'єднувати з рядком, тому вона звертається за адресою пам'яті для рядка s ("Life" в першому циклі).
  4. Для кожного циклу керуючій програмі доводиться двічі звертатися за адресою пам'яті: спочатку для пробілу, а потім для рядка.
  5. В результаті виділення пам'яті відбувається 12 разів.

Що ж відбувається при використанні методу join()?

Image for post
Використання методу "join()" для об'єднання рядків у списку
  1. Керуюча програма порахує рядки в списку, в даному прикладі їх 6.
  2. Це означає, що рядок, що використовується для об'єднання, потрібно повторити 6-1 = 5 разів.
  3. Програма знає, що потрібно 11 областей в пам'яті, тому всі вони застосовуються одночасно і розміщуються заздалегідь.
  4. Рядки розставляються послідовно, видається результат.

Отже, основною причиною різниці в продуктивності є кількість звернень до пам'яті.

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

Підсумок

У цій короткій статті я порівняв застосування оператора + та методу join() для об'єднання рядків в Python. Очевидно, методу join() надають перевагу завдяки його продуктивності.

Вивчення мови програмування передбачає досить довгий шлях, але Python робить його відносно коротшим для новачків. Однак не варто зупинятися на тому, як ви вже вмієте використовувати Python. Як правило різниця між майстром і звичайним розробником полягає в глибшому розумінні деталей. Не переставайте шукати нові підходи на шляху до майстерності.

Переклад статті Christopher Tao : Do Not Use "+" to Join Strings in Python

Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Війти / Зареєструватися