همه ما پایتون رو دوست داریم، کد زدن باهاش مثل شعر گفتنه؛ راحت، خوانا و سریع (منظورم سرعت توسعه است!). اما بیایم با خودمون روراست باشیم: وقتی پای ترافیک‌های سنگین، پردازش‌های لحظه‌ای و نیاز به سرعت وحشتناک اجرا وسط میاد، پایتون خام جلوی غول‌ هایی مثل C++ یا Go کم میاره.

اما چی میشد اگه میتونستیم راحتی پایتون رو نگه داریم، ولی یه لباس از جنس سی ‌پلاس ‌پلاس تنش کنیم تا مثل موشک کار کنه؟ اینجاست که ترکیب Sanic و ujson وارد بازی میشه. بیا تا برات بگم چطور میتونی یه لایه API فوق ‌سریع بسازی که سرورش زیر بار سنگین آخ هم نگه!

اول از همه: Sanic اصلا چیه؟

احتمالاً اسم Flask یا FastAPI به گوشت خورده. Sanic هم یه فریمورک وب پایتونیه، با این تفاوت که از همون روز اول با یک هدف مشخص ساخته شده: سرعت بی‌ رحمانه. سینتکس این فریمورک خیلی شبیه همون Flask دوست‌داشتنیه، اما کاملاً Asynchronous (غیرهمزمان) طراحی شده. Sanic از async/await در پایتون استفاده میکنه تا وقتی یه درخواست داره توی دیتابیس پردازش میشه، سرور بتونه هزاران درخواست دیگه رو همزمان جواب بده، بدون اینکه بلاک بشه.

حلقه گمشده: چرا ujson؟

وقتی یه API میسازی، بخش بزرگی از کار سرور، تبدیل کردن دیکشنری ‌های پایتون به متن JSON (برای فرستادن به کلاینت) و برعکسه (Serialization & Deserialization). ماژول json که به صورت پیش‌فرض تو خود پایتون هست، کار راه‌اندازه، ولی وقتی پای صدهزار ریکوئست در ثانیه در میون باشه، تبدیل به یک گلوگاه (Bottleneck) شدید میشه.

اینجاست که ujson (UltraJSON) مثل یه قهرمان وارد میشه. ujson در واقع یه کتابخونه پایتونی نیست؛ بلکه تماماً با زبان C و C++ نوشته شده و فقط یه رابط (Binding) برای پایتون داره! این یعنی وقتی تو داری تو پایتون دستور ujson.dumps رو صدا میزنی، در پس ‌زمینه یه موتور فوق‌سریع C++ داره دیتای تو رو پردازش میکنه. سرعتش در مقایسه با کتابخونه پیش‌فرض پایتون، گاهی تا چندین برابر بیشتره.

بریم سراغ کد: ترکیب برنده

حالا بیا این دو تا رو با هم ترکیب کنیم. اول باید کتابخونه‌ ها رو نصب کنی:

pip install sanic ujson

حالا یه فایل به اسم app.py بساز و این چند خط کد رو توش بنویس. ببین چقدر راحت دیتای خروجی رو با ujson هندل میکنیم:

from sanic import Sanic, response
import ujson

# ساختن اپلیکیشن
app = Sanic("RocketAPI")

@app.get("/")
async def fast_route(request):
    # دیتایی که قراره برگردونیم
    data = {
        "status": "success",
        "message": "Welcome to the C++ speed in Python!",
        "engine": "Sanic + ujson"
    }
    
    # اینجا جادوی اصلی اتفاق میفته!
    # به جای انجین پیش‌فرض، از ujson.dumps استفاده می‌کنیم
    return response.json(data, dumps=ujson.dumps)

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, fast=True)

چه اتفاقی افتاد؟ ما به response.json در فریمورک Sanic گفتیم: «برای تبدیل کردن این دیکشنری به جیسون، از اون موتور C++ یعنی ujson استفاده کن.» همین یه تغییر کوچیک میتونه زمان پاسخگویی (Response Time) سرور تو رو به شکل چشمگیری کاهش بده و مصرف CPU رو بیاره پایین.

جمع بندی

نمیگم با این کار پایتون دقیقاً هم وزن C++ میشه (چون ماهیت زبان ‌ها متفاوته)، ولی تو با ترکیب معماری غیر همزمان Sanic و موتور پردازش دیتای ujson، عملاً گلوگاه‌ های اصلی وب‌ سرور رو با کد های کامپایل‌ شده ‌ی C جایگزین کردی. نتیجه؟ یه API که توسعه ‌اش به راحتی پایتونه، ولی پرفورمنسش لبخند رضایت رو لب هر توسعه‌ دهنده ‌ای میاره.