Подробный анализ влияния динамической печати и параллелизма на Python?

Опубликовано: 29 Мая, 2021

Python слишком медленный? Реальность такова, что Python - чрезвычайно медленный язык программирования, когда мы смотрим на что-то вроде Java, C и C ++, и становится неловко, насколько они могут делать что-то быстрее, чем Python. в двести раз быстрее, чем собственный язык Python, поэтому в этой статье мы собираемся обсудить, почему это так, а также различные методы, которые мы можем использовать как программисты Python для ускорения и запуска большего количества одновременных приложений Python, пока мы не зашли слишком далеко Стоит отметить, что, хотя Python не хватает скорости, он делает это при разработке и разработке программ на Python намного быстрее, проще и в конечном итоге обходится дешевле, поскольку с проектом требуется меньше труда, теперь это огромное преимущество, во многих случаях вы действительно можете написать Эквивалентный код JAVA на Python примерно в четыре-пять раз быстрее, чем вы могли бы сделать это на этом языке, так что это то, что нужно учитывать?

Почему Python медленный?

Основная причина того, что этот язык (Python) медленный, - это не глобальная блокировка интерпретатора, хотя это фактор, влияющий на скорость и способ, которым мы можем писать более быстрые программы Python, которые не являются основной причиной медленного языка. Причина, по которой Python работает медленно, заключается в том, что он динамически типизирован, теперь мы собираемся поговорить об этом более подробно, но мы хотим провести сравнение с таким языком, как Java. Теперь в Java все статически типизировано, и этот язык компилируется перед запуском, в отличие от Python, который компилируется во время выполнения через интерпретатор. Теперь, что происходит в Java, когда вы пишете код, вам нужно определить, какой тип будет каждая из ваших переменных, какой тип будут возвращать ваши методы и функции, и вам в значительной степени нужно точно определить, что все будет во всем вашем коде. Теперь, хотя это приводит к гораздо более длительному времени разработки и требует гораздо больше времени для написания вашего кода, но то, что он делает, повышает эффективность при компиляции, теперь причина, по которой это действительно работает, и причина, по которой он работает намного быстрее, чем код Python, заключается в том, что если вы знаете тип, который будет иметь конкретная переменная или объект, вы можете выполнить массу различных оптимизаций и избежать выполнения множества различных проверок, пока вы фактически запускаете код, потому что эти проверки выполняются во время компиляции в Java по сути, вы не можете скомпилировать какой-либо Java-код, который не имеет фактических или даже просто типизированных ошибок, пока вы пишете этот код, который вы собираетесь попытаться скомпилировать, и он скажет, что этот тип не точен, вы можете ' Чтобы сделать это, вы не можете скомпилировать его, потому что он знает, что когда дело доходит до среды выполнения, которая не будет работать, по сути, все эти проверки, которые действительно должны выполняться в Python при запуске кода, выполняются заранее, и есть только тонна оптимизации сделана из-за этой статически типизированной длины. Теперь можно задать вопрос, например, почему Python этого не делает? Ответом на это будет: Python динамически типизирован, что просто означает, что любая переменная может изменить свой тип и может изменить свое значение в любой точке программы во время ее работы, что означает, что мы фактически не можем скомпилировать всю программу заранее, потому что мы можем ' Я выполняю все эти проверки сразу, потому что мы не знаем, какого типа будут эти переменные, они будут меняться во время выполнения, будут происходить разные вещи, и из-за этого мы не можем получить все эти оптимизации, которые у нас может быть язык более низкого уровня, такой как Java, C или C ++, и это своего рода фундаментальная причина того, что язык медленный, эта динамическая типизация и любой быстрый язык будут иметь компилятор, который будет работать, он сделает уверен, что все в порядке, он выполнит все эти проверки до того, как фактически закончит запуск кода во время выполнения, где то, что происходит в Python, - это весь ваш код, фактически скомпилированный и проверенный во время выполнения, поэтому вместо того, чтобы компилировать его раньше и Заранее все это время, пока вы запускаете код, выполняется множество проверок, чтобы убедиться, что этот объект правильный, эти типы правильные, все работает одинаково.

Теперь следует поговорить об отсутствии параллелизма в Python. Это будет основным фактором скорости, если вы пишете приложение на Java, C, вы можете распределить все по нескольким потокам, что позволяет вам использовать все ядра вашего процессора, чтобы разбить это на современные вычисления у большинства из нас есть четыре ядра процессора или выше, и это позволяет нам одновременно запускать четыре задачи одновременно с Python, это невозможно. Python говорит, что для каждого интерпретатора у нас может быть не более одного потока, работающего одновременно, а поток - это просто какая-то операция, которая происходит в ядре ЦП, поэтому это означает, что даже если мы создаем много потоков в нашей программе Python, мы можем только использование одного ядра ЦП в программе Java или C может использовать все восемь или использовать все четыре, что приведет к увеличению скорости в 4 или 8 раз, теперь мы можем обойти это в Python, используя многопроцессорность , но есть некоторые проблемы с этим.

Почему в Python существует глобальная блокировка интерпретатора, почему это особенность языка?

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

Как мы можем ускорить наш код Python?

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

Заключение

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

Внимание компьютерщик! Укрепите свои основы с помощью Базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.