Приёмы эффективного кода на Python
easy

Приёмы эффективного кода на Python

Изучи и применяй

Мы собрали 8 приёмов, которые помогут вам писать код так, чтобы вас уважали бывалые программисты. Это поможет оптимизировать структуру данных, сделать код быстрее и использовать меньше памяти. А если вы только начинаете изучать Python, начните с этих статей:

Как установить Python на компьютер и начать на нём писать

Как начать программировать на Python

Создавайте списки быстрее

В Python можно создать новый список на основе существующего. Это быстрее и читабельнее, чем использовать внешний цикл for, как здесь:

# Создаём список из чётных чисел с помощью внешнего цикла for
even_numbers = []
for i in range(10):
    if i % 2 == 0:
        even_numbers.append(i)

Вместо этого сделаем цикл прямо внутри списка:

# создаём список из чётных чисел с помощью автосборки значений по условию
even_numbers = [i for i in range(10) if i % 2 == 0] 

Не используйте глобальные переменные там, где можно обойтись без них

Глобальные переменные хороши, но многие их используют везде — даже в функциях, которые, по идее, должны работать со своими внутренними, локальными переменными и не лезть в глобальные. 

Вместо того чтобы подключать глобальные переменные с помощью команды global, используйте локальные переменные и, если нужно, возвращайте результат их работы в нужную вам переменную.

# Как делают обычно: использование глобальной переменной
my_variable = 10
def my_function():
    global my_variable
    my_variable += 1

Лучше избегать глобальных переменных, когда это возможно, и использовать вместо них локальные:

# Хороший пример: использование локальной переменной
def my_function():
    my_variable = 10
    my_variable += 1
    return my_variable

Используйте генераторы

Генераторы — это способ перебора больших наборов данных, при котором память используется эффективно. С помощью генераторов можно сформировать значения «на лету», а не хранить их все в памяти одновременно. Это может значительно повысить производительность вашего кода.

Например, иногда нужно разделить большой список на более мелкие части для простоты обработки. Цикл for может оказаться неэффективным для этого, а ещё возникают дополнительные проблемы с делением списков и организации серии циклов. 

Вместо этого вы можете использовать ключевое слово yield для создания функции-генератора, которая возвращает фрагменты заданного размера.

Вот пример того, как можно разделить список на части, используя yield:

def chunk_list(lst, chunk_size):
    #делим список на фрагменты с заданным размером
    for i in range(0, len(lst), chunk_size):
        yield lst[i:i+chunk_size]
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Делим список на фрагменты по 3
for chunk in chunk_list(my_list, 3):
    print(chunk)
Приёмы эффективного кода на Python

Освойте ключевое слово in

Ключевое слово in — мощный инструмент для работы со списками, кортежами и словарями. С его помощью можно проверить, присутствует ли элемент в массиве, не перебирая её весь:

# Проверяем, есть ли элемент в списке с помощью цикла for
my_list = [1, 2, 3, 4, 5]
is_present = False
for element in my_list:
    if element == 3:
        is_present = True

С ключевым словом in цикл не нужен — код получается короче и понятнее:

# Проверяем, есть ли элемент в списке с помощью in 
my_list = [1, 2, 3, 4, 5]
is_present = 3 in my_list

Используйте оператор with

Оператор with — это удобный способ управления такими ресурсами, как файлы, сокеты и подключения к базе данных. 

Самый частый пример — работа с файлами. Без этого оператора нам пришлось бы пробовать открыть файл, а затем закрыть его:

# Открываем файл с помощью блока try/finally
f = open("my_file.txt", "r")
try:
    content = f.read()
finally:
    f.close()

Если же использовать with, это гарантирует, что файл (или любое другое подключение) будет правильно закрыт, когда вы закончите с ним работать, даже если произойдет ошибка:

# Открываем файл с помощью оператора with
with open("my_file.txt", "r") as f:
    content = f.read()

Пользуйтесь функцией enumerate

Функция enumerate позволяет перебирать какой-либо массив данных, отслеживая при этом индекс каждого элемента. Это может быть полезно для создания словарей или для распечатки сообщений, когда нужно отследить номер или положение каждого сообщения в списке.

Вот как можно было бы перебрать список с помощью цикла:

# Перебираем список с помощью цикла и индексной переменной
my_list = ["apple", "banana", "cherry"]
for index in range(len(my_list)):
    print(index, my_list[index])

То же самое можно сделать изящнее и эффективнее, без использования индекса списка:

# Перебираем список с помощью функции enumerate
my_list = ["apple", "banana", "cherry"]
for index, item in enumerate(my_list):
    print(index, item)

Не забывайте про аргументы по умолчанию

Мы привыкли к тому, что у функции или есть аргументы (и тогда мы должны указать их при вызове), или их нет. Но ещё можно использовать аргументы по умолчанию, которые работают так:

  • если при вызове пользователь указал аргументы, то используем их;
  • если при вызове аргументов не было, используем какие-то заранее определённые значения по умолчанию.

Это поможет сделать ваш код более читабельным и уменьшить количество строк:

В обычном случае нам придётся указывать дополнительные условия:

# Функция без аргументов по умолчанию
def my_function(x, y):
    if x is None:
        x = 0
    if y is None:
        y = 0
    return x + y

С аргументами по умолчанию функция становится намного короче и проще:

# Функция с аргументами по умолчанию
def my_function(x=0, y=0):
    return x + y

Изучите модуль itertools

Модуль itertools предоставляет набор функций для работы с итераторами. Вот что с ним можно сделать:

  • объединить несколько итераторов в один;
  • сделать бесконечный цикл повторения итератора, который не приведёт к зацикливанию программы;
  • группировать итераторы по выбранной функции.

Короче, если вы пишете код для создания или обработки списков, используйте итераторы и работайте с ними через модуль itertools — так будет проще и быстрее. Вот как можно создать список с помощью цикла:

# Создаём список уникальных элементов с помощью цикла
my_list = ["apple", "banana", "banana", "cherry", "cherry"]
unique_items = []
for item in my_list:
    if item not in unique_items:
        unique_items.append(item)

Но лучше использовать модуль itertools — он это сделает быстрее и нагляднее:

# Создаём список уникальных элементов с помощью itertools
import itertools
my_list = ["apple", "banana", "banana", "cherry", "cherry"]
unique_items = list(itertools.groupby(sorted(my_list)))
unique_items = [k for k, g in unique_items]

Текст:

Инна Долога

Редактор:

Михаил Полянин

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Юлия Зубарева

Курс «C++ для бэкенда»
Если интересно делать быстрые высоконагруженные системы, посмотрите на программу курса «Яндекс Практикума». Понятная теория, тренажеры, поддержка ревьюеров и обучение в группе, всё как надо.
Посмотреть
Курс «C++ для бэкенда»
Курс «C++ для бэкенда»
Курс «C++ для бэкенда»
Курс «C++ для бэкенда»
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
easy