Cython چیست؟  Python با سرعت زبان C

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

زبان Cython در واقع یک فوق مجموعه (Superset) برای زبان Python است که به C کامپایل شده و باعث افزایش عملکرد و سرعت برنامه های نوشته شده به زبان Python می شود. برای کارهایی که به انواع اشیاء بومی و داخلی پایتون محدود هستند، افزایش سرعت زیاد نخواهد بود اما برای عملیات های عددی و محاسباتی، افزایش سرعت چشمگیر خواهد بود.

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

چگونه از Cython استفاده کنیم؟

کد زیر را که کاملا به پایتون نوشته شده را درنظر بگیرید:

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

حالا نسخه سایتون کد بالا را درنظر بگیرید:

اگر انواع متغیر ها را (هم برای پارامتر های تابع هم برای متغیر های داخل تابع) به طور صریح اعلان کنیم (نوعشان مشخص باشد)، سایتون همه آن ها را به C ترجمه می کند. همچنین می توان از کلمه کلیدی cdef برای تعریف توابعی استفاده کرد که اساسا در C اجرا می شوند. اگرچه این توابع را فقط می توان با توابع دیگر سایتون فراخوانی کرد و نه با اسکریپت های پایتون. (در مثال بالا، یک کد پایتون فقط می تواند به تابع integrate_f دسترسی داشته باشد).

مزیت های Cython

جدا از اینکه می توانید سرعت اجرای کد خود را بهبود ببخشید، سایتون مزایای دیگری نیز هم دارد:

دسترسی به کتابخانه های خارجی زبان C که می تواند سریعتر باشد

پکیج های پایتون مثل NumPy، کتابخانه های C را د رابط های پایتون قرار می دهد تا کار با آن ها راحت تر باشد. به هرحال رفت و برگشت ها بین پایتون و C می تواند سرعت را کاهش دهد. سایتون این امکان را به شما می دهد تا به طور مستقیم با کتابخانه های C در ارتباط باشید. (کتابخانه های C++ نیز پشتیبانی می شود).

می توانید از هر دو مدیریت حافظه پایتون و C استفاده کنید

اگر از اشیا پایتون استفاده می کنید، آن ها توسط مدیریت حافظه خود python و garbage-collected جمع آوری و مدیریت می شوند. اما اگر می هواهید ساختار های سطح C خود را ایجاد و مدیریت کنید، با استفاده از malloc/free می توانید آن ها را مدیریت کنید. این کار توسط خودتان و اصطلاحا به صورت دستی انجام می شود.

سایتون - cython

در صورت لزوم می توانید ایمنی یا سرعت را انتخاب کنید

سایتون به طور خودکار بررسی های زمان اجرا را برای مشکلات رایجی که در C ظاهر می شوند، انجام می دهد. مشکلاتی مانند دسترسی خارج از محدوده به عناصر و اندیس های یک آرایه. درنتیجه، کد C تولید شده با سایتون از کد C تولید شده توسط یک انسان، امن تر است.

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

می توان از Cython برای مخفی کردن کد های حساس Python استفاده کرد

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

محدودیت های Cython

استفاده از سایتون محدودیت هایی دارد و اینطور نیست که هر نوع کد پایتون را به سایتون تبدیل کرده و سرعت اجرا را زیاد کنیم.

افزایش سرعت برای کد معمولی پایتون زیاد نیست

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

افزایش سرعت برای ساختار داده های خود پایتون نیز کم است

پایتون مجموعه ای از ساختار های داده مانند رشته ها، لیست ها، tuple ها، دیکشنری ها و غیره را فراهم می کند. آن ها برای توسعه دهندگان بسیار مفید هستند و همراه با مدیریت حافظه خود ارائه می شوند. در نتیجه سرعت آن ها از کد خالص C کمتر است.

سایتون به شما این امکان را می دهد تا از تمامی ساختار های داده چایتون استفاده کنید، اما بدون سرعت زیاد. برای رسیدن به سرعت واقعی سایتون، باید از ساختار های داده زبان C استفاده کنید. خبر خوب این است که سایتون کار با آن ها را ساده کرده است.

سایتون هنگامی که شامل کد خالص C باشد، سریعتر است

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

خوشبختانه، سایتون ابزاری دارد که بتوانیم این گلوگاه ها را شناسایی و مانیتور کنیم. این ابزار مشخص می کند که کدام بخش از کد به صورت C خالص نوشته شده و کدام بخش ها با پایتون تعامل دارند.

قسمت های سفید رنگ، کد خاص C را نشان می دهند. قسمت های زرد رنگ، تعامل سایتون با پایتون را نشان می دهد که باعث افت عملکرد برنامه می شود. بهتر است تا تعداد این بخش ها کمتر باشد.

Cython NumPy

سایتون از کتابخانه های مبتنی بر C مثل NumPy یک کتابخانه برای محاسبات و کار با اعداد است، پشتیبانی می کند. از آن جا که سایتون در C کامپایل می شود، می تواند مستقیما با این نوع کتابخانه ها ارتباط برقرار کرده و محدودیت های سرعت پایتون را دور بزند.

QR:  Cython چیست؟  Python با سرعت زبان C
به اشتراک بگذارید