Как ускорить программу на python
Перейти к содержимому

Как ускорить программу на python

  • автор:

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

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

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

Обновлено: 2023-06-23 19:47:44 Сергей Бензенко автор материала

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

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

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

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

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

Работа со словарями Python включает в себя добавление, удаление элементов и доступ к ним.

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

2. sort() или sorted()

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

sort() или sorted()

sort() или sorted() - 2

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

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

Использование 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 раза.

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

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

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

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

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

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

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

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

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

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

Функция pd read json в библиотеке Pandas позволяет загружать данные из JSON файла в DataFrame.

Чтобы получить доступ к элементам в каждом кортеже, можно разделить список кортежей, добавив звездочку (*) и используя несколько переменных. Например, 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.

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

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

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

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

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

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

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

Если нужно проверить, является ли переменная пустой, используйте 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().

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

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

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

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

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

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

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

Сергей Бензенко автор-переводчик статьи « Ten Tricks To Speed Up Your Python Codes »

Как ускорить программу на python? �� 10 простых способов для повышения производительности

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

1. Используйте правильные алгоритмы и структуры данных

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

2. Оптимизируйте циклы и итерации

Итерации могут быть потенциальной причиной замедления программы. Проверьте, можно ли оптимизировать циклы или заменить их на более эффективные конструкции, такие как генераторы. Используйте функции-агрегаторы, такие как sum() , min() и max() , вместо ручного прохода по данным.

3. Используйте компиляцию для ускорения

Использование компиляции может значительно ускорить выполнение программы. Одним из популярных инструментов является Numba, который позволяет компилировать функции Python в быстрый машинный код. Пример:

 from numba import jit @jit def my_function(): # Ваш код 

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

Python предлагает широкий выбор встроенных функций и модулей, которые могут значительно ускорить выполнение кода. Некоторые из них включают: map() , filter() , itertools , numpy и другие. Используйте их, когда это возможно, вместо написания собственных реализаций.

5. Параллельное выполнение

Если ваша программа выполняет большое количество вычислений, рассмотрите возможность параллельного выполнения. Модули, такие как concurrent.futures и multiprocessing, позволяют распараллеливать код и использовать все доступные ядра процессора. Пример:

 from concurrent.futures import ThreadPoolExecutor def my_function(): # Ваш код with ThreadPoolExecutor() as executor: executor.map(my_function, my_data) 

6. Оптимизируйте операции ввода-вывода

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

7. Используйте специализированные библиотеки или модули

Если ваша программа требует выполнения специализированных задач, рассмотрите возможность использования специализированных библиотек или модулей. Например, NumPy предоставляет эффективные операции с массивами, а pandas — удобные средства для анализа данных.

8. Оптимизируйте использование памяти

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

9. Используйте профилирование для определения узких мест

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

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

⚡️Как ускорить работу программы Python? Простые способы и советы

Чтобы ускорить работу программы Python, вы можете применить несколько методов: 1. Используйте более эффективные алгоритмы и структуры данных: — Подумайте о возможности замены циклов на генераторы или списковые выражения для более быстрой обработки данных. — Избегайте избыточных повторных вычислений и сохраняйте промежуточные результаты, чтобы избежать ненужной работы. 2. Оптимизируйте ваш код: — Избегайте использования медленных операций, таких как операции с большими списками или циклы внутри циклов. — Воспользуйтесь встроенными функциями Python или библиотеками, чтобы ускорить выполнение определенных задач. — Вместо использования общего подхода к программированию, подберите оптимальные специализированные решения. 3. Предпочитайте компилированные или более эффективные библиотеки: — Если вам нужно обрабатывать большие объемы данных или выполнить сложные операции, рассмотрите использование библиотек, таких как NumPy, Pandas или Cython, которые выполняются быстрее благодаря компиляции или оптимизации. Вот пример оптимизации кода на Python:

 # Исходный код, который можно ускорить for i in range(1000000): result += i # Оптимизированный код result = sum(range(1000000)) 

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

Детальный ответ

Как ускорить работу программы Python

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

1. Использование эффективных структур данных

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

 # Пример использования словаря my_dict = print(my_dict["apple"]) # Пример использования списка my_list = [1, 2, 3, 4, 5] my_list.append(6) print(my_list) 

2. Оптимизация циклов

  • Используйте списковые включения (list comprehensions) — они позволяют создавать новые списки с использованием более эффективной синтаксической конструкции.
  • Избегайте повторных вычислений — если внутри цикла есть какие-то вычисления, которые можно выполнить только один раз, лучше выполнить их перед циклом.
  • Используйте итерацию по элементам вместо индексов — в некоторых случаях итерация по элементам списка может быть более эффективной, чем обращение по индексу.
 # Пример использования спискового включения my_list = [1, 2, 3, 4, 5] squared_list = [x ** 2 for x in my_list] # Пример избегания повторных вычислений my_list = [1, 2, 3, 4, 5] total = sum(my_list) for num in my_list: result = num / total # Пример использования итерации по элементам my_list = [1, 2, 3, 4, 5] for item in my_list: print(item) 

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

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

 # Пример использования функции из модуля itertools from itertools import combinations my_list = [1, 2, 3, 4, 5] combinations_list = list(combinations(my_list, 2)) print(combinations_list) 

4. Используйте компиляцию

Python — интерпретируемый язык программирования, но вы можете воспользоваться компиляцией для ускорения выполнения кода. Например, вы можете использовать JIT-компиляторы, такие как PyPy или Numba, для улучшения производительности программы. Компиляция может быть особенно полезной, если ваша программа содержит большое количество вычислительных операций.

5. Оптимизация ввода-вывода

Если ваша программа выполняет много операций ввода-вывода, это может стать узким местом в производительности программы. В таком случае вы можете попробовать оптимизировать ввод-вывод, используя следующие подходы:

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

6. Устранение утечек памяти

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

Заключение

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

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

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

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

import numpy as np np.random.seed(0) values = np.random.randint(1, 100, size=1000000) def get_reciprocal(values): output = np.empty(len(values)) for i in range(len(values)): output[i] = 1.0/values[i] %timeit get_reciprocal(values)

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 множество тактов ЦП используется для проверки типа.

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

a = 1

Шаг 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.

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

import numpy as np np.random.seed(0) values = np.random.randint(1, 100, size=1000000) %timeit result = 1.0/values

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

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

Вернёмся к коду: самое важное здесь — это 1.0/values . values — это не число, а массив NumPy. Наряду с оператором деления есть множество других.

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

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

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

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

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

#include #include #include int main() < struct timeval stop, start; int length = 1000000; int rand_array[length]; float output_array[length]; for(int i = 0; igettimeofday(&start, NULL); for(int i = 0; i gettimeofday(&stop, NULL); printf("took %lu us\n", (stop.tv_sec - start.tv_sec) * 1000000 + stop.tv_usec - start.tv_usec); printf("done\n"); return 0; >
using System; namespace speed_test < class Program< static void Main(string[] args)< int length = 1000000; double[] rand_array =new double[length]; double[] output = new double[length]; var rand = new Random(); for(int i =0; ilong start = DateTimeOffset.Now.ToUnixTimeMilliseconds(); for(int i =0;i long end = DateTimeOffset.Now.ToUnixTimeMilliseconds(); Console.WriteLine(end - start); > > >
import java.util.Random; public class speed_test < public static void main(String[] args)< int length = 1000000; long[] rand_array = new long[length]; double[] output = new double[length]; Random rand = new Random (); for(int i =0; ilong start = System.currentTimeMillis(); for(int i = 0;i long end = System.currentTimeMillis(); System.out.println(end - start); > >
let length = 1000000; let rand_array = []; let output = []; for(var i=0;i let start = (new Date()).getMilliseconds(); for(var i=0;i let end = (new Date()).getMilliseconds(); console.log(end - start);
На правах рекламы

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

  • Python
  • скорость выполнения

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

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