Практики: производительность, память и удобство

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

База исходного кода, которой соответствует лучшие современные практики, высоко ценится на сегодняшний день. Это отличный способ объединить крутых разработчиков при условии, что ваш проект имеет открытый исходный код. Как разработчику, вам бы хотелось писать эффективный и оптимизированный код, который:

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

Те практики, которые будут разобраны в данной статье, могут помочь вам: внести свой вклад в Open Source организацию, предоставить готовое решение на Online Judge, вести работу над большими задачами по обработке данных, используя машинное обучение, или вы сможете просто разрабатывать свой проект.

Практика 1: Старайтесь не расходовать память!

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

В отличие от C/C++, за управление памятью в Python отвечает интерпретатор, вследствие этого пользователи не контролируют этот процесс (память). Управление памятью в Python включает в себя приватную кучу, которая состоит из всех Python-объектов и структур данных.

Менеджер памяти в Python предоставляет внутренний доступ к приватной куче. При создании объекта виртуальная машина Python (PVM) выделяет нужное количество памяти и решает, куда в памяти этот объект будет помещен.

Так или иначе, глубокое понимание того, как все устроено и знание того, какие существуют способы работы с памятью, помогут вам минимизировать затрачиваемое количество памяти в вашем приложении.

Используйте генераторы для вычисления большого количества результатов:

Генераторы дают возможность производить «ленивые» вычисления. Суть использования такого вычисления заключается в итерации: как с помощью явного использования “for”, так и неявного. For просто передает это вычисление любой функции или конструкции, которая и осуществляет итерацию.

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

  • Для обработки большого объема чисел и/или данных вы можете использовать библиотеку наподобие Numpy. которая отлично управляет ресурсами памяти;
  • Не используйте + для создания длинных строк. В Python строка является неизменяемой, поэтому строки слева и справа от исходной будут скопированы в новую строку для каждой подобной пары конкатенации. Если вы конкатенируете четыре строки каждая длинной 10, то у вас получится следующая сумма: (10+10) + ((10+10)+10) + (((10+10)+10)+10) = 90, и получается вместо 40 целых 90 символов. Объем квадратично увеличивается в зависимости от размера и количества строк. Например, Java оптимизировала эту задачу, трансформировав наборы конкатенаций, за счет использования StringBuilder, но Python нет. По этой причине, рекомендуется использовать. format или % для конкатенации строк, несмотря на то, что при конкатенации коротких строк + работает быстрее. Или даже лучше, если у вас уже есть содержимое в виде итеративного объекта, используйте «.join (iterable_object), который намного быстрее.

Если вы все-таки не можете выбрать между. format и %, то обратите внимание на данное обсуждение на StackOverflow.