Как писать код на Python лучше: 6 рекомендаций



Книга Как писать код на Python лучше: 6 рекомендаций

В среде разработчиков 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() работает быстрее, чем оператор +.


Заключение


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


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


833   0  

Comments

    Ничего не найдено.