как ускорить работу кода python

Три простых способа улучшить производительность кода Python

1. Бенчмарк, бенчмарк и еще раз бенчмарк

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

Прежде всего установим line_profiler, позволяющий измерить затраты времени на каждую строчку кода в функции:

Во время исполнения программы функция sum_of_lists при вызове будет профилирована. Обратите внимание на декоратор @profile над определением функции.

Чтобы запустить бенчмарк, введите:

как ускорить работу кода python. line profiler output. как ускорить работу кода python фото. как ускорить работу кода python-line profiler output. картинка как ускорить работу кода python. картинка line profiler output. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

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

Имейте в виду, что эта библиотека для измерения сама потребляет значительные ресурсы во время использования. Но она замечательно подходит для выявления слабых мест в программе с последующей заменой их на что-нибудь более эффективное.

Чтобы запустить line_profiler из Jupyter Notebook, попробуйте магическую команду %%lprun .

2. По возможности избегайте циклов

Посмотрим, насколько резво работает новая версия с картой по сравнению с изначальной. Измерим их скорость 1000 раз.

Версия с map более чем в 6 раз быстрее!

как ускорить работу кода python. map solution performance. как ускорить работу кода python фото. как ускорить работу кода python-map solution performance. картинка как ускорить работу кода python. картинка map solution performance. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

3. Компилируйте ваши модули Python с помощью Cython

Если совсем нет желания редактировать проект, но хочется хоть какого-нибудь улучшения производительности без лишних усилий, ваш лучший друг – Cython.

Для этого потребуется установить на машине как собственно Cython, так и компилятор С:

Если вы работаете на Debian системе, загрузите GCC следующим образом:

Давайте разделим изначальный код примера на два файла с названиями test_cython.py и test_module.pyx :

Наш главный файл должен импортировать эту функцию с файла test_module.pyx :

Теперь напишем скрипт setup.py для компиляции нашего модуля при помощи Cython:

Наконец пришло время скомпилировать наш модуль:

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

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

как ускорить работу кода python. cython version performance. как ускорить работу кода python фото. как ускорить работу кода python-cython version performance. картинка как ускорить работу кода python. картинка cython version performance. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Итоги

Источник

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

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

как ускорить работу кода python. 1592301507. как ускорить работу кода python фото. как ускорить работу кода python-1592301507. картинка как ускорить работу кода python. картинка 1592301507. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Рисунок 1 | Встроенные функции в Python 3

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

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

как ускорить работу кода python. 1592301508. как ускорить работу кода python фото. как ускорить работу кода python-1592301508. картинка как ускорить работу кода python. картинка 1592301508. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Рисунок 2 | Примеры функций set() и sum()

2. sort() или sorted()

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

как ускорить работу кода python. 1 1592301508. как ускорить работу кода python фото. как ускорить работу кода python-1 1592301508. картинка как ускорить работу кода python. картинка 1 1592301508. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

как ускорить работу кода python. 2 1592301508. как ускорить работу кода python фото. как ускорить работу кода python-2 1592301508. картинка как ускорить работу кода python. картинка 2 1592301508. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Рисунок 3| sort() и sorted()

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

как ускорить работу кода python. 1592301509. как ускорить работу кода python фото. как ускорить работу кода python-1592301509. картинка как ускорить работу кода python. картинка 1592301509. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Использование sorted() со словарем

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

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

как ускорить работу кода python. 1 1592301509. как ускорить работу кода python фото. как ускорить работу кода python-1 1592301509. картинка как ускорить работу кода python. картинка 1 1592301509. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Использование list() и dict() напрямую.

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

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

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

как ускорить работу кода python. 1592301510. как ускорить работу кода python фото. как ускорить работу кода python-1592301510. картинка как ускорить работу кода python. картинка 1592301510. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

В сочетании с третьим способом мы можем превратить список в словарь или набор, изменив [] на <>. Давайте перепишем код с рисунка 5. Мы можем пропустить присвоение и завершить итерацию внутри скобок. Например,sorted_dict3 = .

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

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

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

как ускорить работу кода python. 1 1592301510. как ускорить работу кода python фото. как ускорить работу кода python-1 1592301510. картинка как ускорить работу кода python. картинка 1 1592301510. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Рисунок 7 | Пример enumerate()

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

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

как ускорить работу кода python. 2 1592301510. как ускорить работу кода python фото. как ускорить работу кода python-2 1592301510. картинка как ускорить работу кода python. картинка 2 1592301510. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

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

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

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

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

как ускорить работу кода python. 1592301511. как ускорить работу кода python фото. как ускорить работу кода python-1592301511. картинка как ускорить работу кода python. картинка 1592301511. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Проверка вхождения, с помощью in и set()

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

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

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

как ускорить работу кода python. 1 1592301511. как ускорить работу кода python фото. как ускорить работу кода python-1 1592301511. картинка как ускорить работу кода python. картинка 1 1592301511. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Простая проверка переменной

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

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

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

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

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

как ускорить работу кода python. 2 1592301511. как ускорить работу кода python фото. как ускорить работу кода python-2 1592301511. картинка как ускорить работу кода python. картинка 2 1592301511. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

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

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

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

как ускорить работу кода python. 3 1592301511. как ускорить работу кода python фото. как ускорить работу кода python-3 1592301511. картинка как ускорить работу кода python. картинка 3 1592301511. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Рисунок 12 | цикл for внутри функции

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

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

Источник

Как оптимизировать код на Python

как ускорить работу кода python. 1 js 9 ljiuM7vSAQOBoQR0g. как ускорить работу кода python фото. как ускорить работу кода python-1 js 9 ljiuM7vSAQOBoQR0g. картинка как ускорить работу кода python. картинка 1 js 9 ljiuM7vSAQOBoQR0g. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Как я сократил время выполнения приложения на 1/10

Данные советы просты в реализации и могут пригодиться вам в обозримом будущем.

Считается, что первоочередной задачей программиста является написание чистого и эффективного кода. Как только вы создали чистый код, можете переходить к следующим 10 подсказкам. Я подробно объясню их ниже.

Как я измеряю время и сложность кода?

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

Если есть такая возможность, то вместо перебора данных коллекций пользуйтесь поиском.

Векторизация вместо циклов

Присмотритесь к Python-библиотекам, созданным на С (Numpy, Scipy и Pandas), и оцените преимущества векторизации. Вместо прописывания цикла, который раз за разом обрабатывает по одному элементу массива М, можно выполнять обработку элементов одновременно. Векторизация часто включает в себя оптимизированную стратегию группировки.

Сократите количество строк в коде

Пользуйтесь встроенными функциями Python. Например, map()

Каждое обновление строковой переменной создает новый экземпляр

Пример выше уменьшает объем памяти.

Для сокращения строк пользуйтесь циклами и генераторами for

Пользуйтесь многопроцессорной обработкой

Если ваш компьютер выполняет более одного процесса, тогда присмотритесь к многопроцессорной обработке в Python.

Она разрешает распараллеливание в коде. Многопроцессорная обработка весьма затратна, поскольку вам придется инициировать новые процессы, обращаться к общей памяти и т.д., поэтому пользуйтесь ей только для большого количества разделяемых данных. Для небольших объемов данных многопроцессорная обработка не всегда оправдана.

Многопроцессорная обработка очень важна для меня, поскольку я обрабатываю по несколько путей выполнения одновременно.

Пользуйтесь Cython

Cython — это статический компилятор, который будет оптимизировать код за вас.

Загрузите расширения Cythonmagic и пользуйтесь тегом Cython для компиляции кода через Cython.

Воспользуйтесь Pip для установки Cython:

Для работы с Cython:

Пользуйтесь Excel только при необходимости

Не так давно мне нужно было реализовать одно приложение. И мне бы пришлось потратить много времени на загрузку и сохранение файлов из/в Excel. Вместо этого я пошел другим путем: создал несколько CSV-файлов и сгруппировал их в отдельной папке.

Примечание: все зависит от задачи. Если создание файлов в Excel сильно тормозит работу, то можно ограничиться несколькими CSV-файлами и утилитой на нативном языке, которая объединит эти CSV в один Excel-файл.

Пользуйтесь Numba

Это — JIT-компилятор (компилятор «на лету»). С помощью декоратора Numba компилирует аннотированный Python- и NumPy-код в LLVM.

Разделите функцию на две части:
1. Функция, которая выполняет вычисления. Ее декорируйте с @autojit.

2. Функция, которая выполняет операции ввода-вывода.

Пользуйтесь Dask для распараллеливания операций Pandas DataFrame

Dask очень классный! Он помог мне с параллельной обработкой множества функций в DataFrame и NumPy. Я даже попытался масштабировать их в кластере, и все оказалось предельно просто!

Пользуйтесь пакетом swifter

Swifter использует Dask в фоновом режиме. Он автоматически рассчитывает наиболее эффективный способ для распараллеливания функции в пакете данных.

Это плагин для Pandas.

Пользуйтесь пакетом Pandarallel

Pandarallel может распараллеливать операции на несколько процессов.

Опять же, подходит только для больших наборов данных.

Общие советы

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

как ускорить работу кода python. 1*OBbpXX8CsJIKpNQhNf83DQ. как ускорить работу кода python фото. как ускорить работу кода python-1*OBbpXX8CsJIKpNQhNf83DQ. картинка как ускорить работу кода python. картинка 1*OBbpXX8CsJIKpNQhNf83DQ. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Заключение

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

Источник

Увеличиваем скорость работы Python до уровня C++ с Numba

Увеличиваем скорость работы Python до уровня C++ с Numba

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

Прим. ред. Это перевод. Мнение редакции может не совпадать с мнением автора оригинала.

Тест базовой скорости

Для сравнения базовой скорости Python и C++ я буду использовать алгоритм генерации случайных простых чисел.

как ускорить работу кода python. 1 aZz pe1eeI3DbeIHHisAkQ. как ускорить работу кода python фото. как ускорить работу кода python-1 aZz pe1eeI3DbeIHHisAkQ. картинка как ускорить работу кода python. картинка 1 aZz pe1eeI3DbeIHHisAkQ. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Блок-схема алгоритма генерации простых чисел

Реализация на Python

Реализация на C++

Результат

Комментарий

Как и ожидалось, программа на C++ выполняется в 25 раз быстрее, чем на Python. Ожидания подтвердились, потому что:

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

Numba

Numba — это Open Source JIT-компилятор, который переводит код на Python и NumPy в быстрый машинный код.

Чтобы начать использовать Numba, просто установите её через консоль:

Реализация на Python с использованием Numba

Как вы могли заметить, в коде добавились декораторы njit:

Итоговая скорость Python

Теперь вы знаете что Python способен обогнать C++. О других способах увеличения скорости работы Python читайте в статье про пять проектов, которые помогают ускорить код на Python.

Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.

Перейти к регистрации

Источник

Как ускорить код на Python в тысячу раз

как ускорить работу кода python. fc. как ускорить работу кода python фото. как ускорить работу кода python-fc. картинка как ускорить работу кода python. картинка fc. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Обычно говорят, что Python очень медленный

В любых соревнованиях по скорости выполнения программ Python обычно занимает последние места. Кто-то говорит, что это из-за того, что Python является интерпретируемым языком. Все интерпретируемые языки медленные. Но мы знаем, что Java тоже язык такого типа, её байткод интерпретируется JVM. Как показано, в этом бенчмарке, Java намного быстрее, чем Python.

Вот пример, способный показать медленность Python. Используем традиционный цикл for для получения обратных величин:

3,37 с ± 582 мс на цикл (среднее значение ± стандартное отклонение после 7 прогонов по 1 циклу)

Ничего себе, на вычисление всего 1 000 000 обратных величин требуется 3,37 с. Та же логика на C выполняется за считанные мгновения: 9 мс; C# требуется 19 мс; Nodejs требуется 26 мс; Java требуется 5 мс(!), а Python требуется аж целых 3,37 СЕКУНДЫ. (Весь код тестов приведён в конце).

Первопричина такой медленности

Обычно мы называем Python языком программирования с динамической типизацией. В программе на Python всё представляет собой объекты; иными словами, каждый раз, когда код на Python обрабатывает данные, ему нужно распаковывать обёртку объекта. Внутри цикла for каждой итерации требуется распаковывать объекты, проверять тип и вычислять обратную величину. Все эти 3 секунды тратятся на проверку типов.

В отличие от традиционных языков наподобие C, где доступ к данным осуществляется напрямую, в Python множество тактов ЦП используется для проверки типа.

как ускорить работу кода python. image loader. как ускорить работу кода python фото. как ускорить работу кода python-image loader. картинка как ускорить работу кода python. картинка image loader. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Даже простое присвоение числового значения — это долгий процесс.

Шаг 1. Задаём a->PyObject_HEAD->typecode тип integer

Шаг 2. Присваиваем a->val =1

Подробнее о том, почему Python медленный, стоит прочитать в чудесной статье Джейка: Why Python is Slow: Looking Under the Hood

Итак, существует ли способ, позволяющий обойти проверку типов, а значит, и повысить производительность?

Решение: универсальные функции NumPy

В отличие list языка Python, массив NumPy — это объект, созданный на основе массива C. Доступ к элементу в NumPy не требует шагов для проверки типов. Это даёт нам намёк на решение, а именно на Universal Functions (универсальные функции) NumPy, или UFunc.

как ускорить работу кода python. image loader. как ускорить работу кода python фото. как ускорить работу кода python-image loader. картинка как ускорить работу кода python. картинка image loader. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Если вкратце, благодаря UFunc мы можем проделывать арифметические операции непосредственно с целым массивом. Перепишем первый медленный пример на Python в версию на UFunc, она будет выглядеть так:

Это преобразование не только повышает скорость, но и укорачивает код. Отгадаете, сколько теперь времени занимает его выполнение? 2,7 мс — быстрее, чем все упомянутые выше языки:

2,71 мс ± 50,8 мкс на цикл (среднее значение ± стандартное отклонение после =7 прогонов по 100 циклов каждый)

как ускорить работу кода python. image loader. как ускорить работу кода python фото. как ускорить работу кода python-image loader. картинка как ускорить работу кода python. картинка image loader. Тестирование производительности программы кажется утомительным процессом. Но если у вас уже есть рабочий код Python, разделенный на функции, то задачу можно свести к простому добавлению декоратора к функции, требующей профилирования.

Здесь можно найти все операторы Ufunc.

Подводим итог

Если вы пользуетесь Python, то высока вероятность того, что вы работаете с данными и числами. Эти данные можно хранить в NumPy или DataFrame библиотеки Pandas, поскольку DataFrame реализован на основе NumPy. То есть с ним тоже работает Ufunc.

UFunc позволяет нам выполнять в Python повторяющиеся операции быстрее на порядки величин. Самый медленный Python может быть даже быстрее языка C. И это здорово.

Приложение — код тестов на C, C#, Java и NodeJS

На правах рекламы

Воплощайте любые идеи и проекты с помощью наших VDS с мгновенной активацией на Linux или Windows. Создавайте собственный конфиг в течение минуты!

Источник

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

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