Избегайте этих простых ошибок, держите Python на плаву!

Введение
Python — это язык программирования, который с самого начала никогда не был ориентирован на скорость. Конечно, есть определенные проблемы с производительностью, и в идеале язык должен работать максимально быстро и эффективно, но по замыслу Python такие вещи, как читабельность и удобство использования, важнее скорости. В свою очередь, это означает, что более опытные профессионалы, которые не могут быть ограничены таким синтаксисом, затем ограничены языком.
Хотя Python, естественно, довольно медленный язык, есть несколько способов избежать превращения его в суперслаг. Это полезно, если мы хотим обучить модель в Python или просто работать со списком, и эти различия обычно довольно легко сделать. Однако, чтобы упростить задачу, имеет смысл провести это обсуждение, попытавшись выявить, что программисты на Python обычно делают неправильно.
Не использовать встроенные функции
Python — это язык сценариев, а это означает, что все, что мы пишем на нем, должно интерпретироваться компилятором с другого языка. Это создает одну серьезную проблему — скорость; для операций, где Python должен быть быстрым, эта проблема интерпретации может вызвать большую задержку. Однако, к счастью, многие из функций, которые мы используем в Python изо дня в день, на самом деле являются функциями, написанными для Python на C.
С C мы возвращаем скорость и мощь Python, позволяя запускать вещи в основном в функции, которую не нужно интерпретировать. Сам язык, а также стандартная библиотека написаны на C. Это означает, что использование уже доступных вам модулей и инструментов действительно ускорит ваш код! Это особенно актуально в таких сценариях, как использование карты и/или лямбды для применения функций к коллекциям, а не итерации. Однако существует так много различных сценариев, в которых вы столкнетесь со встроенной функцией, которая сделает что-то значительно быстрее, чем «сырой» подход Python.
Не используя понимания
Одна вещь, которая замедляет работу любого языка программирования — и обычно довольно сильно — это итерация. Итерация особенно сложна для языков, работающих в одном потоке, таких как Python, языков сценариев, таких как Python, и языков с динамической типизацией, таких как Python. При этом повсеместное использование итераций, как в таком языке, как C, может очень легко привести код Python к черепашьей скорости.
Кроме того, чтобы получить возврат из цикла for, вам нужно будет учитывать, насколько медленнее другие шаги, такие как инициализация. Рассмотрим следующее понимание, которое создает массив из x, добавляя целое число 5 к каждому элементу внутри него.
x = [5, 10, 15, 20] new_arr = [i + 5 for i in x]
Понимание массивов великолепно, но Python может предложить гораздо больше. Определенно, со списками работать обычно, но что, если вы хотите сделать словарь без итерации? К счастью, в Python также есть понимание словаря:
d = {i: i + 1 for ii in range(1, 20)}
Идя еще дальше, Python также имеет наборы и даже генераторы! Излишне говорить, что со всеми этими пониманиями можно избежать написания итеративного цикла большую часть времени! Это может сэкономить вам много времени на интерпретацию в Python, и нет нужды говорить; это то, что нам часто нужно сохранять при работе в Python. При этом понимания — одна из моих любимых возможностей языка для получения скорости с минимальными усилиями, поэтому я настоятельно рекомендую прочитать их и попробовать!
a_generator = (2 * x for x in range(1, 20))
a_set = {i * 8 for i in range(1, 20)}
Плохая рекурсия
Плохая рекурсия может привести к значительным проблемам в любом языке программирования. Проблема становится еще более заметной, когда она применяется к интерпретируемым языкам сценариев, таким как Python. При этом, вероятно, было бы неплохо избегать рекурсии вообще в Python в большинстве сценариев. Существует множество рекурсивных сценариев, в которых вместо этого можно использовать цикл, и это, безусловно, оптимальная практика, когда она доступна.
При этом могут быть случаи, когда вам абсолютно необходимо использовать рекурсию. Это обычное дело для случаев, когда вы не можете понять структуру некоторых данных, например, алгоритм, который добавляет несколько диктов в словарь. Мы понятия не имеем, сколько других словарей может быть внутри каждого словаря в словаре, и в конечном итоге все очень быстро становится очень проблематичным. Конечно, дела обстоят еще хуже с таким языком программирования, как Python, где важна каждая унция скорости. Также довольно сложно объяснить, что такое плохая рекурсия, но важно помнить, что когда вы делаете рекурсивный вызов функции, все, что предшествует этому рекурсивному вызову, оценивается каждый раз, когда выполняется вызов. При этом итерация внутри рекурсивной функции похожа на вложенную итерацию, только намного хуже.
Плохую рекурсию трудно исправить или объяснить, и, кроме того, рекурсия — это решение, которого я, вероятно, изо всех сил старался бы избегать в любом языке, особенно в Python.
Заключение
Спасибо, что прочитали мой небольшой обзор некоторых очень распространенных ошибок Python, которые могут серьезно повлиять на производительность ваших проектов Python. Python определенно не самый быстрый язык в мире, поэтому во многих случаях имеет смысл попытаться выжать из Python все возможное, что мы можем. Еще раз спасибо за чтение моей статьи и вашу постоянную поддержку в целом, это действительно много значит для меня, и я ценю всю вашу любовь и постоянную поддержку, которую я испытал до сих пор. В любом случае, счастливого изучения Python, удачи в поддержании скорости языка и хорошего дня!