В среде разработчиков Python считается одним из самых популярных языков программирования. Он используется везде  —  от веб-разработки до машинного обучения.

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

Несмотря на такое большое количество достоинств, у Python есть один недостаток  —  низкая скорость. Python  —  это интерпретируемый язык, и он медленнее других языков программирования. Но попробуем нейтрализовать этот недостаток, воспользовавшись приемами, способными сделать код на Python более быстрым, чем обычно. Итак, начнем!

Правильный алгоритм и структура данных

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

В Python у множеств и словарей скорость поиска O(1), так как они задействуют хеш-таблицы. Множества и словари используются вместо списков, когда в коллекции:

  • нет повторяющихся элементов;
  • нужно проводить многократный поиск элементов;
  • большое количество элементов.

Временная сложность различных структур данных в Python описана здесь.

Использование встроенных функций и библиотек

Один из лучших способов ускорения кода  —  это встроенные функции Python. Их нужно использовать при любой возможности. Эти встроенные функции хорошо протестированы и оптимизированы.

Почему они такие быстрые? Потому что реализованы на языке C. Это относится к таким встроенным функциям Python, как min, max, all, map и другим.

Поэтому в целях более быстрого выполнения кода стоит отдать предпочтение им, а не писать функции вручную.

Например, вместо такого кода:

newlist = []

for word in wordlist:
    newlist.append(word.upper())

Лучше написать вот такой:

newlist = list(map(str.upper, wordlist))

Или:

newlist = [word.upper() for word in wordlist]

Здесь используется встроенная функция map, которая написана на C. А значит, код выполнится намного быстрее, чем с циклом.

Использование множественных присваиваний

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

Например, так:

firstName = "John"
lastName = "Henry"
city = "Manchester"

В Python для этого есть способ получше:

firstName, lastName, city = "John", "Henry", "Manchester"

Такое присваивание значений переменным будет гораздо более четким и элегантным.

Использование генераторов списков вместо циклов

Генераторы списков позволяют всего в одной строке кода создать новый список на основе элементов существующего списка.

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

Еще одно преимущество генераторов списков: при добавлении элементов в список Python они быстрее, чем метод append.

Например, вот как используется здесь метод append:

newlist = []
for i in range(1, 100):
    if i % 2 == 0:
        newlist.append(i**2)

Но лучше задействовать генератор списка:

newlist = [i**2 for i in range(1, 100)  if i%2==0]

Код обычно выглядит чище при использовании генераторов списков.

Правильный импорт

Следует избегать импорта ненужных модулей и библиотек до тех пор, пока они действительно не понадобятся. Лучше указать имя модуля вместо того, чтобы импортировать полную библиотеку.

Импорт ненужных библиотек приведет к замедлению скорости выполнения кода.

Пример: предположим, нужно найти квадратный корень числа. Вместо вот этого:

import math
value = math.sqrt(50)

Используйте это:

from math import sqrt
value = sqrt(50)

Конкатенация строк

В Python для конкатенации строк используется оператор +. Но есть и другой способ  —  метод join, который более характерен для Python. С ним конкатенация строк выполняется быстрее, чем с оператором +.

Почему? Потому что оператор +создает новую строку, а затем копирует старую на каждом шаге.

Например, вот так:

output = "Programming " + "is " + "fun"

В то время как метод join() работает по-другому:

output = " ".join(["Programming" , "is", "fun"])

Вывод обоих методов будет одинаковым. Единственное отличие: метод join() работает быстрее, чем оператор +.

Заключение

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

Спасибо за внимание!

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

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


Перевод статьи Pralabh Saxena: 6 Tips To Make Python Code Run Incredibly Faster

Предыдущая статьяУправление файлами в Google Colab
Следующая статьяКак протестировать код на Go с Github Actions