برنامه‌های وب پایتون یک ایده وحشتناک برای پروژه‌های تحلیلی هستند.

منتشر شده در towardsdatascience به تاریخ ۱ آگوست ۲۰۲۱

لینک منبعPython Web Apps Are a Terrible Idea for Analytics Projects.

این یک غریزه است. ما دانشمندان داده عاشق پایتون هستیم. بنابراین ما در هر کاربرد به سمت چارچوب‌های پایتون جذب می‌شویم. و به نظر می‌رسد که زبان قدرتمند نیز در بیشتر موارد خوب عمل می‌کند. یکی از این سناریوها ساخت برنامه‌های کاربردی وب برای پروژه‌های تحلیلی است.

کلمه کلیدی در آن «بیشتر موارد» است. پایتون زبان زیبایی است که تقریبا در هر مشکلی استفاده می‌شود. با این حال، یک نگاه دقیق‌تر ممکن است تفاوت‌های ظریفی را نشان دهد که ممکن است پایتون را در برخی موارد بی‌ربط کند.

سال‌های زیادی است که من یکی از طرفداران Django هستم. این محبوب‌ترین چارچوب پایتون برای ساخت برنامه‌های کاربردی وب است. دجانگو با هر چیزی که یک چارچوب وب معمولی نیاز دارد همراه است - احراز هویت، انتقال پایگاه داده، رابط مدیریت و موارد دیگر. یکپارچه‌سازی الگوریتم یادگیری ماشینی ساده است چون هر دو به یک زبان هستند.

با این حال، من باید بعد از کشف یک حقیقت وحشتناک در مورد چارچوب، ذهنم را تغییر می‌دادم. به طور خاص، کاربرد آن در پروژه‌های علم داده. اما این یک موضوع دجانگو نیست؛ این پایتون است. شما باید با همین مساله مواجه شوید حتی اگر از دیگر چارچوب‌های وب پایتون مانند فلاسک(Flask) استفاده کنید.

۰اما قبل از اینکه برای کنار گذاشتن دجانگو / فلاسک عجله کنیم، باید بگویم که این یک بن‌بست نیست. ما می‌توانیم پایتون را دوباره عالی کنیم؛ به عنوان یک چارچوب وب.

در این مقاله، ما در مورد آن بحث خواهیم کرد.

  • مقایسه فلاسک با ExpressJS برای انجام یک کار طولانی‌مدت.
  • بررسی کنید که چرا برنامه‌های کاربردی وب پایتون در پروژه‌های تحلیلی از هم می‌پاشند و؛
  • راه‌حل‌هایی برای تبدیل برنامه‌های کاربردی وب پایتون به خدمات بهتر به درخواست‌ها.

برنامه‌های وب پایتون و جاوا اسکریپت.

ما نیاز به یک نمایش برای درک این موضوع با پایتون در مقایسه با JavaScript داریم.

بنابراین، بیایید از دو چارچوب محبوب در هر زبان برای انجام وظیفه یکسان - محاسبه عدد 30 فیبوناچی استفاده کنیم. در اینجا نحوه انجام این کار با استفاده از فلاسک (پایتون) آورده شده‌است.

from flask import Flask

app = Flask(__name__)

def fib(n):

return n if n < 2 else fib(n - 1) + fib(n - 2)

@app.route("/")

def hello_world():

return {"data": fib(30)}

پایتون (فلاسک) در حال عمل کردن سی امین عدد فیبوناچی-نوشته نویسنده.

برای اجرای وظیفه بالا، می‌توانید از دستورهای زیر در یک پایانه استفاده کنید:

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

حال اجازه دهید همین کار را با استفاده از Express JS انجام دهیم(JavaScript) :

const express = require("express");

const app = express();

const port = 5000;

const fib = (n) => {

if (n < 2) return n;

return fib(n - 1) + fib(n - 2);

};

app.get("/", (req, res) => {

res.send({ data: fib(30) });

});

app.listen(port, () => {

console.log(`Example app listening at http://localhost:${port}`);

});

(ExpressJS) JavaScript در حال انجام ۳۰ امین عدد فیبوناچی.

در اینجا چگونگی شروع سرور با استفاده از گره آمده‌است:

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

همانطور که می‌بینید، هر دو از هر لحاظ شبیه هم هستند. هیچ پارامتری در درخواست لازم نیست، ۳۰ امین عدد فیبوناچی را محاسبه می‌کند و مقدار را در پاسخ برمی گرداند.

ما هر دو برنامه را در حالت توسعه در یک موضوع واحد راه‌اندازی می‌کنیم. این دقیقا همان چیزی است که ما نیاز داریم زیرا ما عملکرد آن‌ها را در یک موضوع واحد اندازه‌گیری می‌کنیم.

در نهایت، با ارسال درخواست‌های متعدد به سرور و ثبت زمان سرور، دنیای واقعی را شبیه‌سازی کنید. کد زیر ۱۰۰۰ درخواست را به سرور ما در ۱۰ رشته موازی ارسال می‌کند. این برنامه همچنین زمان متوسط سپری شدن را به میلی‌ثانیه چاپ خواهد کرد.

import requests

from multiprocessing import Pool

def fetch(i):

return requests.get("http://localhost:5000/").elapsed.microseconds

if __name__ == "__main__":

with Pool(10) as p:

res_times = p.map(fetch, list(range(1000)))

avg_time = sum(res_times) / len(res_times) if len(res_times) else 0

print(f"On average each request took {round(avg_time/1000)} milliseconds.\n\n")

محاسبه میانگین زمان پاسخ ۱۰۰۰ درخواست با استفاده از ۱۰ موضوع توسط نویسنده.

بیایید نتایج را مقایسه کنیم. در اینجا نتایج زمانی که سرور گره در حال سرویس دادن است آورده شده‌است:

نمایش میانگین زمان گرفته شده‌برای محاسبه ۳۰ امین فیبوناچی به تعداد ۱۰۰۰ بار با استفاده از سرور JavaScript-از مولف.

و این هم وقتی که فلاسک در حال سرو کردن درخواست‌ها است:

برای محاسبه ۳۰ امین فیبوناچی ۱۰۰۰ بار با استفاده از یک سرور پایتون-از مولف.

انجام این آزمایش چندین بار به اعداد مشابه منجر خواهد شد. اکسپرس (JavaScript) درخواست‌ها را تقریبا چهار برابر سریع‌تر از فلاسک (پایتون) سرویس می‌دهد.

محاسبه عدد فیبوناچی ۳۰ کار طولانی‌مدت نیست. اما این برای کمک به ما در درک اهمیت موضوع کافی است.

چه چیزی وب سرورهای پایتون را کند می‌کند؟

شما به رستورانی با نام«Sync» می‌روید که در آن نام پیشخدمت پایتون است. یک غریبه اول غذا را سفارش می‌دهد. پایتون به آشپزخانه رفت و بعد از بیست دقیقه بازگشت و به غریبه سرو کرد. سپس نزد شما آمد و پرسید: آقا، چه چیزی می‌توانم به شما بدهم؟

اگه حالا دستور بدهید، باید بیست دقیقه دیگر صبر کنید.

از روی ناامیدی، آن رستوران را ترک کردید و به رستوران دیگری به نام«Async» نقل‌مکان کردید. در اینجا نام پیش‌خدمت جاوا اسکریپت است. دوباره، یک غریبه اول غذای خود را سفارش می‌دهد. جاوا اسکریپت به آشپزخانه رفت و یک دقیقه بعد برگشت. او چیزی را به طرف غریبه تحویل داد و به راه شما آمد و پرسید: چه چیزی می‌توانم به شما بدهم، آقا؟

شما غذای خود را سفارش داده‌اید؛ غریبه در هجده دقیقه بعدی سهم خود را گرفت و شما در بیست دقیقه مال خود را گرفتید.

این روشی است که پایتون و جاوا اسکریپت کار می‌کنند. پایتون بر روی وظایف در یک زمان به صورت همزمان کار می‌کند. با این وجود، جاوا اسکریپت درخواست دیگری را دریافت می‌کند در حالی که در حال حاضر یک درخواست در حال انجام است. این رفتار غیر همزمان برنامه‌های کاربردی وب مبتنی بر JavaScript را سریع‌تر می‌سازد.

چگونه باعث شویم که برنامه‌های کاربردی وب پایتون برای تجزیه و تحلیل بهتر عمل کنند؟

تا زمانی که فقط درخواست‌های کوتاه مدت یا کارهای طولانی مدت با چند درخواست پیش‌بینی شده از کاربران دارید، خوب هستید. چارچوب‌های پایتون مانند فلاسک و دجانگو ایده‌آل هستند زیرا شما می‌توانید همه چیز را در یک زبان حفظ کنید-پایتون.

پیچیدگی زمانی به وجود می‌آید که شما وظایف طولانی‌مدت با تقاضای قابل‌توجه داشته باشید. برای بالا نگه داشتن سرور، شما ممکن است مجبور شوید چندین نمونه را به کار ببرید و آن را به خوبی تنظیم کنید. این کار کردن در اغلب موارد پایدار نیست. این کار باعث بالا رفتن هزینه‌ها تا حد یک ارتفاع دیوانه کننده می‌شود.

پروژه‌های علم داده اغلب چنین وظایف بلند مدتی دارند. محاسبات سنگین بدون رفتار غیر همزمان ممکن است نیاز به توان محاسباتی بیشتری داشته باشد. با این حال، روش‌هایی وجود دارند که می‌توانید قبل از رفتن به یک چارچوب متفاوت امتحان کنید.

سعی کنید کد خود را بهینه‌سازی کنید.

صرف‌نظر از این که از چه چارچوبی استفاده خواهید کرد، بهتر است که همیشه سعی کنید کد خود را بهینه کنید. به نظر می‌رسد که کتابخانه اخیر در بهینه‌سازی برنامه‌های پایتون فوق‌العاده عمل می‌کند.

توپلکس کد پایتون شما را به LLVM اصلی تبدیل می‌کند و آن را به صورت موازی اجرا می‌کند. تیم پشت کتابخانه، در یک مقاله تحقیقاتی، نشان داد که سرعت آن در حدود ۹۱ X است.

رفتاری ناهمزمان به همراه داشته باشید.

هم فلاسک و هم دجانگو راه‌هایی برای ایجاد رفتار غیر همزمان دارند. برای کارهایی که به طور بالقوه وقت‌گیر هستند، این راه حل یک جایگزین شگفت‌انگیز است.

با این حال، هر دو چارچوب در اسناد خود ذکر کردند که دارای چندین اشکال هستند. بنابراین استفاده از آن‌ها در تمام درخواست‌های وب توصیه نمی‌شود.

کتابخانه استاندارد پایتون، به شما کمک می‌کند برخی از وظایف خود را به صورت غیر همزمان تبدیل کنید. سعی کنید هر زمان که ممکن است از آن استفاده کنید.

از آنجا که پایتون به صورت غیر همزمان نیست، همه این کارها به اجرای یک لوپ رویداد نامحدود بستگی دارند. اگرچه آن‌ها از بسیاری جهات کامل نیستند، اما بهتر است قبل از مهاجرت آن‌ها را در نظر بگیرید.

معماری را با کرفس(celery) تغییر دهید.

به عنوان آخرین تفریح، می‌توانید از کرفس(Celery) همراه با فلاسک و دجانگو استفاده کنید. کرفس به شما اجازه می‌دهد که پرسوجوهایتان را در یک صف اجرا کنید. من اغلب از آن‌ها در هنگام ساخت پایپ‌لاین‌های داده استفاده می‌کنم که در آن وظایف به طور طبیعی طولانی‌مدت هستند.

وظیفه درخواست وب این است که دادهٰها را در صف قرار دهد تا Celery بقیه موارد را مدیریت کند. پاسخ فوری به این درخواست یک شناسه وظیفه خواهد بود. با استفاده از یک نقطه پایانی مجزا، کاربر می‌تواند تکمیل کار را در صف پرس و جو کند.

افکار نهایی

پایتون یک زبان برنامه‌نویسی فوق‌العاده برای علم داده است. از آنجا که این یک زبان عمومی است، کاربردهای پایتون به علم داده محدود نمی‌شوند. اما به این معنی نیست که این زبانی کامل برای هر مورد استفاده است.

از آنجا که اغلب دانشمندان داده، پایتون را دوست دارند، ما چارچوب‌هایی مانند فلاسک و دجانگو را برای ساخت برنامه‌های کاربردی وب انتخاب می‌کنیم. با این حال، رفتار همزمان آن ممکن است منجر به معایب جدی هزینه در تولید شود.

جاوا اسکریپت که به طور طبیعی غیر همزمان است، تمایل به انجام بهتر وظایف بلند مدت دارد. اما چارچوب‌های پایتون نیز کارهایی برای بهبود عملکرد خود دارند. از این رو مهم است که قبل از تصمیم‌گیری برای مهاجرت آن‌ها را در نظر بگیرید.

متشکرم که مطالعه کردید، دوست من!

این متن با استفاده از ربات ترجمه مقالات علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.