В среде разработчиков 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()
работает быстрее, чем оператор +
.
Заключение
Вот и все. В статье мы рассказали о нескольких приемах для ускорения кода. Эти рекомендации особенно пригодятся на соревнованиях по программированию с ограничением по времени.
Спасибо за внимание!
Читайте также:
- 3 способа локального хранения и чтения учетных данных в Python
- Что нового в Python 3.10?
- Как отслеживать события файловой системы в Python
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Pralabh Saxena: 6 Tips To Make Python Code Run Incredibly Faster