Десять способов для ускорения кода на Python

В последние годы было приложено много усилий для улучшения производительности Python. Теперь можно быстро обрабатывать большие наборы данных, используя библиотеки numpy, scipy, pandas, numba. А также Pypy, которая ускоряет выполнение кода на Python, в пару раз.

В данной статье я поделюсь десятью методами ускорения Python без использования сторонних инструментов. Приведенные в данной статье примеры доступны в этом репозитории на Github.

1. Познакомьтесь со встроенными возможностями

Десять методов для ускорения кода на Python Рисунок 1 | Встроенные возможности в Python 3

Python поставляется с множеством встроенных возможностей, реализованных на языке программирования C, которые быстры и отлично поддерживаются(рисунок 1). К примеру, возможности, связанные с алгебраическими вычислениями: abs(), len(), max(), min(), set(), sum()).

В виде примера рассмотрим встроенные возможности set() и sum(). Их использование может повысить скорость выполнения кода в десятки раз.

Десять методов для ускорения кода на Python Рисунок 2 | Примеры возможностей set() и sum()

2. sort() или sorted()

Обе возможности предназначены для сортировки списков. Функцию sort() быстрее, чем sorted(). Это связано с тем, что способ sort() изменяет первичный список. sorted() создает новый отсортированный список и оставляет исходный список без изменений.

Десять методов для ускорения кода на Python
Десять методов для ускорения кода на Python Рисунок 3| sort() и sorted()

Но функцию sorted() более универсальна. Она принимает любую коллекцию, в то время как функцию sort()работает только со списками. Например, при помощи sorted() можно легко быстро отсортировать словарь по его ключам или значениям.

Десять методов для ускорения кода на Python Использование sorted() со словарем

3. Используйте символы вместо возможностей

Для создания пустого словаря или списка вместо dict() или list() можно использовать фигурные скобки «{}». Как и для пустого набора, когда необходимо использовать set()) и [].

Десять методов для ускорения кода на Python Использование list() и dict() прямо.

4. Генератор списков

Для создания нового списка из старого списка мы используем цикл for. Он может перебрать старый список, преобразовать его значения на основе заданных условий и сохранить в новом списке. Например, чтобы найти все четные числа из another_long_list, можно использовать приведенный ниже программный код:

even_num = []for number in another_long_list: if number % 2 == 0: even_num.append(number)

Но есть более лаконичный метод переборки. Для его реализации мы помещаем исходный цикл for всего в одну строку кода. При этом скорость выполнения увеличивается почти в 2 раза.

Десять методов для ускорения кода на Python Генератор списков

В сочетании с третьим методом мы можем превратить список в словарь или набор, изменив [] на {}. Давайте перепишем код с рисунка 5. Мы можем пропустить присвоение и завершить итерацию внутри скобок. К примеру,sorted_dict3 = {key: value for key, value in sorted(a_dict.items(), key=lambda item: item[1])}.

Функцию sorted(a_dict.items(), key=lambda item: item[1]) вернет список кортежей(рисунок 4). Здесь мы используем множественное присваивание для распаковки кортежей. Поскольку каждому кортежу в списке мы присваивали ключ его первому элементу и значение его второму элементу. После этого каждая пара ключ-значение сохраняется в словаре.

5. Используйте возможность enumerate() для получения значений и индексов

Можно использовать возможность enumerate(), которая превращает значения списка в пары index и value. Это также ускорит Python-код примерно в 2 раза.

Десять методов для ускорения кода на Python Рисунок 7 | Пример enumerate()

6. Используйте zip() для слияния списков

Иногда необходимо перебирать два списка или даже более. Для этого можно легко использовать возможность zip(), которая преобразует пару списков в один список кортежей. При этом спискам лучше иметь одинаковую длину, иначе выполнение zip() остановится, как только закончится самый короткий список.

Десять методов для ускорения кода на Python Пример zip()

Чтобы приобрести доступ к элементам в каждом кортеже, можно без труда разделить список кортежей, добавив звездочку(*) и используя пару переменных. К примеру, letters1, numbers1 = zip(*pairs_list).

7. Совмещайте set() и in

Для проверки наличия определенного значения часто пишется подобная функцию:

# Функцию проверки вхожденияdef check_membership(n): for element in another_long_list:   if element == n:            return True return False 

Далее вызывается способ check_membership(value), чтобы увидеть, есть ли значение в another_long_list. Но лучше просто использовать in, вызвав value in another_long_list.

Десять методов для ускорения кода на Python
Проверка вхождения, при помощи in и set()

Для большей эффективности надо сначала удалить дубликаты из списка при помощи set(), а далее проверить вхождение в объекте набора. Так мы сократим число элементов, которые надо проверить.

8. Проверка переменной на истинность

Для проверки пустых переменных, списков, словарей не необходимо явно указывать == True или is True в операторе if. Вместо этого лучше указать имя переменной.

Десять методов для ускорения кода на Python
Простая проверка переменной

Если необходимо проверить, будет ли переменная пустой, используйте if not string_returned_from_function.

9. Для подсчета уникальных значений используйте Counters()

Чтобы подсчитать уникальные значения в списке a_long_list, который мы создали в пункте 1, необходимо создать словарь. Его ключи являются числами, а значения – счетчиками. Выполняя проход по списку, увеличиваем значение счетчика, если элемент есть в словаре. А также добавлять его в словарь, если его там нет.

num_counts = {}for num in a_long_list:    if num in num_counts:        num_counts[num] += 1 else:        num_counts[num] = 1

Но более эффективный метод сделать это – использовать подкласс Counter() из библиотеки коллекций:

num_counts2 = Counter(a_long_list).

Чтобы приобрести десять наиболее часто встречающихся чисел, используйте способ most_common, доступный в Counter().

Десять методов для ускорения кода на Python
Пример Counter()

10. Вложите цикл for внутрь возможности

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

Но вместо выполнения возможности миллион раз(длина a_long_list составляет 1 000 000), можно интегрировать цикл for внутрь возможности. Это сэкономит около 22% времени.

Десять методов для ускорения кода на Python
Рисунок 12 | цикл for внутри возможности

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *