В стеках только для Python не учтены серьезные недостатки. Вот как это исправить.

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

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

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

Тем не менее, мне пришлось передумать после того, как я узнал ужасающую правду о фреймворке. В частности, его использование в проектах по науке о данных. Но это не Django; Это Python. Вам придется столкнуться с той же проблемой, даже если вы используете другие веб-фреймворки Python, такие как Flask.

Но прежде чем броситься к дампу Django / Flask, я должен был сказать, что это не тупик. Мы можем снова сделать Python великим; как веб-фреймворк.

В этой статье мы обсудим

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

Веб-приложения на Python и JavaScript.

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

Следовательно, давайте воспользуемся двумя популярными фреймворками на каждом языке для решения одной и той же задачи - вычисления 30-го числа Фибоначчи. Вот как мы это делаем с помощью Flask (Python).

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

pip install flask # if Flask is not installed yet.
flask app.py

Теперь сделаем то же самое с Express JS (JavaScript):

Вот как вы можете запустить сервер с помощью узла:

npm install express --save # if express is not installed already
node app.js

Как видите, оба во всех отношениях похожи. Он не принимает никаких параметров в запросе, вычисляет 30-е число Фибоначчи и возвращает значение в ответ.

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

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

Сравним результаты. Вот результаты, когда сервер Node обслуживает:

И вот то же самое, когда Flask обслуживает запросы:

Выполнение этого эксперимента несколько раз приведет к почти одинаковым результатам. Express (JavaScript) обслуживает запросы почти в четыре раза быстрее, чем Flask (Python).

Вычисление 30-го числа Фибоначчи - непростая задача. Но этого достаточно, чтобы понять масштаб проблемы.

Что замедляет работу веб-серверов Python?

Вы идете в ресторан с названием «Sync», где официанта зовут Python. Сначала незнакомец заказывает себе еду. Питон пошел на кухню, вернулся через двадцать минут и обслужил незнакомца. Затем он подошел к вам и спросил: «Что я могу вам предложить, сэр?»

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

Из-за разочарования вы покинули этот ресторан и переехали в другой под названием «Асинхронный». Здесь название воды - JavaScript. И снова незнакомец заказывает еду первым. JavaScript отправился на кухню и через минуту вернется. Он пробормотал что-то незнакомцу, подошел к вам и спросил: «Что я могу вам предложить, сэр?»

Вы заказали еду; незнакомец получил свой через восемнадцать минут, а ты - через двадцать.

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

Как улучшить работу веб-приложений Python для аналитики?

Пока у вас есть только краткосрочные запросы или длительные задачи с небольшим количеством ожидаемых запросов от пользователей, вы в порядке. Фреймворки Python, такие как Flask и Django, идеальны, потому что вы можете сохранить все на одном языке - Python.

Сложность возникает, когда у вас есть длительные задачи со значительным спросом. Чтобы сервер оставался в рабочем состоянии, вам, возможно, придется развернуть несколько экземпляров и хорошо сбалансировать его нагрузку. Этот обходной путь в большинстве случаев не является устойчивым. Это взлетает до безумной высоты.

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

Отделите вычисление от цикла запрос-ответ.

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



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

Попробуйте оптимизировать свой код.

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

Tuplex преобразует ваш код Python в собственный LLVM и запускает его параллельно. Команда разработчиков библиотеки в своей исследовательской статье показала, что она примерно в 91 раз быстрее. Вот подробная статья, которую я писал по этой теме раньше:



Добавьте асинхронное поведение.

У Flask и Django есть способы обеспечить асинхронное поведение. Этот обходной путь является прекрасной альтернативой для потенциально трудоемких задач.

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

Стандартная библиотека Python asyncio поможет вам преобразовать некоторые из ваших функций в асинхронный режим. По возможности старайтесь использовать его.

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

Последние мысли

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

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

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

Если вы по-прежнему предпочитаете веб-приложение Python вашим проектам в области науки о данных, попробуйте streamlit.



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

Передайте мне привет в LinkedIn, Twitter и Medium. Я сломаю тебе лед.

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