رزبری پای پایتون Python

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

نوشته شده توسط نیلوفر مهرنیا

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

 


معرفی سایتون (Cython)


سایتون واسطه ای بین پایتون و ++c/c است که این امکان را به شما میدهد که کد پایتون را با اندکی تغییرات که در ادامه خواهیم گفت, به کد c برای سیستم تبدیل کنید بدون اینکه لازم باشد زبان برنامه نویسی c را بلد باشید یا نیاز باشد که از زبان دیگری برای پروژه ی خود استفاده کنید.

 


نصب پیش نیازها


اگر pip را ندارید ابتدا باید آن را نصب کنید، از دستور زیر در ترمینال ماشین لینوکسی خود برای نصب pip استفاده کنید.

sudo apt-get install python-pip

 

سپس باید cython را نصب کنیم، دستور زیر را در ترمینال وارد کنید.

pip install cython

 

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

 


 ایجاد فایل pyx. و اعمال تغییرات


در اولین مرحله از فایل پایتون خود کپی میگیریم و با همان نام اما با پسوند pyx. در همان پوشه ذخیره میکنیم. در قدم بعدی باید در کد داخل فایل pyx تغییراتی را انجام دهیم، که در ادامه توضیح داده خواهد شد.

  •  اولین مواردی که باید تغییر کنند نوع معرفی متغیرها است.

میدانیم که در پایتون نوع متغییرها از روی مقداری که داخل آنها ریخته میشود شناسایی میشود و نیازی به تعریف نوع متغییر نداشتیم اما در c اینگونه نیست و متغییرها در زمان معرفی باید type خود را هم تعریف کنند. قبل از تعریف type باید از کلمه ی cdef استفاده شود. انواع متغییر در سایتون.

  1. int
  2. char
  3. float
  4. double
  5. list
  6. dict
  7. object

برای مثال:

cdef int a = 3

توجه کنید که حتی متغیرهای شمارنده حلقه ها نیز باید تعریف شوند. برای مثال:

cdef int i

for i in range(0, 67):

 

اگر متغییر boolean دارید باید به این شکل تعریف شود.

from libcpp cimport bool //تعریف کتابخانه
cdef bint v // معرفی متغییر

 

  •  مورد دومی که باید تغییر کند, نحوه ی تعریف توابع است.

در پایتون توابع با def مشخص میشدند اما اینجا سه نوع متفاوت را داریم.

def : این توابع تنها میتوانند توسط پایتون اجرا شوند.

cdef : این توابع تنها میتوانند توسط c اجرا شوند.

cpdef : این توابع میتوانند توسط پایتون و c اجرا شوند.

توصیه من این است که از cpdef استفاده کنید. برای مثال.

cpdef process():

 


راه‌اندازی cython


حالا نوبت به تبدیل کد سایتون به c میرسد: در همان پوشه که فایل py. و pyx. قرار دارند یک فایل پایتون جدید ایجاد کنید و برای مثال نام آن را setup.py بگذارید. داخل این فایل کدهای زیر را بنویسید.

import distutils.core

import Cython.Build

distutils.core.setup(ext_modules=Cython.Build.cythonize("name.pyx"))

دقت کنید در کد های بالا به جای name باید نام فایل pyx خود را بنویسید.

 


ایجاد فایل cython


سپس وارد محیط ترمینال شوید و با دستور cd به پوشه ای که این فایل ها درون آن قرار دارد بروید. برای مثال.

cd /home/pi/Desktop/Files

 

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

python setup.py build_ext --inplace

 


اجرای cython


سپس در ترمینال که با دستور cd در پوشه خود قرار گرفته بودید می‌نویسید python، تا محیط اجرای کد پایتون براتان باز شود و مینویسید import name و دقت کنید name همان اسمی است که بالاتر تعریف کردیم و اینجا بدون پسوند نوع فایل نوشته میشود. با اجرای این خط کد شما اجرا خواهد شد. فایل هایی که در انتها در دسترس خواهید داشت.

نکته، امکان انجام این کار در رزبری پای هم وجود دارد و تفاوتی با روش بالا ندارد.

 


ارور های رایج


اگر در آخر به ارور زیر برخورد کردید، مشکل در عدم تطابق نسخه های پایتون است. مراحل را از ابتدا شروع کنید و در همه مراحل از یک نسخه پایتون استفاده کنید. اگر از پایتون ۳ استفاده میکنید به جای pip از pip3 و به جای python از python3 استفاده شود.

undefined symbol _py_zerostruct

 


 جمع بندی


در این آموزش یاد گرفتیم چگونه با استفاده از سایتون به کد های پایتون خود سرعت بدهیم . برای اینکار لازم است اندکی تغییرات در فایل پایتون لحاظ کنیم و  فایل .pyx و .c را بسازیم تا کدها با استفاده از کامپایلر c اجرا شوند. این روش ممکن است برای برخی کدها اثربخشی زیادی نداشته باشد مخصوصا در پروژه هایی که در آنها از چند نخی (multi threading) استفاده کرده اید.

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

نیلوفر مهرنیا

مهندس نرم افزار

تبادل نظر و رفع عیب با ثبت دیدگاه

۲ دیدگاه

  • کلا چیز جالبی نیست چون خیلی کد کثیف و مضخرفی ایجاد می کنه و داخل کد کار هایی رو انجام میده که کاملا بی ربط و اضافه هستن و به اشتباه توسط cython جنریت شدن.
    حتی اگه بخوایم کد تبدیل شده توسط cython رو به صورت یک لایبرری c/c++ به یک روژه اضافه کنیم دردسر های بیشتری خواهیم داشت در حدی که منصرف شدن و نوشتن کد دوباره با c/c++ گزینه ساده تر و بهتری میشه.

    • سلام
      در کل به اینکه کد رو با زبان c بنویسیم نمیرسه اما به هر حال یک روش است که مزیت های خودش را دارد مثلا سریع تر بودن برای کسی که آشنایی با زبان c ندارد.