معرفی زبان برنامه نویسی Cython
معرفی زبان برنامه نویسی Cython
زبان برنامه نویسی Cython برای توسعه پیدا کردن ماژول پایتون طراحی شده است. شیوه کار در Cython به این صورت است که، ابتدا ماژول خودش را با کمک قوانین cython و پسوند .pyx مینویسد، بعد فایلی با پایتون میسازد و با نصب آن سایتون فراخوانی میشود، سپس ماژول توسط سایتون برای c ترجمه میگردد. در نهایت متن مورد نظر به ماژول قابل استفاده تبدیل میشود(این کار توسط کامپایلر انجام میشود.) برای شناخت بیشتر زبان برنامه نویسی Cython با ما همراه باشید.
کاربرد زبان سایتون
زبان برنامه نویسی Cython برای سادهتر کردن ساخت افزونههای c توسط پایتون، طراحی شده است. این زبان برای تبدیل کدهای موجود در پایتون به c مجوز میدهد. یکی دیگر از ویژگیهای موثر و مفید cython این است که برای کدهای بهینه شده این امکان را فراهم میکند که بدون کمک گرفتن از وابستگیهای جانبی با پایتون همراه گردند.
حتی اگر شما فردی مبتدی هستید به راحتی میتوانید زبان Cython را یاد بگیرید زیرا با وجود اینکه این زبان بسیار قدرتمند است اما کار با آن بسیار راحت و آسان است. البته باید بدانید که اگر برای اجرای سایتون با آمار و ریاضیات سر و کار دارید، اجرای آن چندان سریع انجام نمیگیرد.
مثال کد زبان برنامه نویسی Cython
کد زیر مثالی ساده از ساخت یک ماژول با زبان برنامه نویسی Cython است که میتواند جمله “hello World” را پرینت کند. (متن زیر، کد اصلی ماژول است که توسط cython باید به c ترجمه شود.)
# hello.pyx
def say_hello():
print "Hello World!"
متن زیر نیز فایل نصبی مورد نیاز برای فراخوانی Cython است:
# setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(name = 'Hello world app',
ext_modules = cythonize("*.pyx"))
فراخوانی ماژول در پایتون
# launch.py
# This code is always interpreted, like normal Python.
# It is not compiled to C.
import hello
hello.say_hello()
در نهایت دو دستور نوشته شده در خط فرمان (sh/bash ) ماژول مورد نظر را میسازند و فراخوانی میکنند.
مثال ۲ از زبان برنامه نویسی Cython
با مثالی ساده از اسناد cython که در زیر نوشته شده است، تابع انتگرال را پیاده سازی میکنیم:
def f(x):
return x**2-x
def integrate_f(a, b, N):
s = 0
dx = (b-a)/N
for i in range(N):
s += f(a+i*dx)
return s * dx
شاید به ظاهر خواندن و حتی درک کردن کد بالا راحت به نظر آید اما به خاطر اینکه پایتون مجبور است به طور دائم مابین انواع مقادیر عددی ماشین و شیءهای خودش جا به جا شود، اجرای کد نوشته شده به کندی صورت میگیرد.
حال با توجه به نسخه سایتون کد بالا، کد زیر را که در اینجا زیر بخشهای اضافه شده سایتون خط کشیده شده است، در نظر بگیرید:
cdef f(double x):
return x**2-x
def integrate_f(double a, double b, int N):
cdef int i
cdef double s, x, dx
s = 0
dx = (b-a)/N
for i in range(N):
s += f(a+i*dx)
return s * dx
بخشهای اضافه شده به برنامه این اجازه را میدهد که بین کد، انواعی از متغییرها تعریف گردد، و در نهایت کامپایلر cython میتواند بخشهای اضافه را برای c تفسیر کند.
نوع توابع cdef و cpdef
برای استفاده از نوع c یا cython میتوان از کلیدواژه cdef استفاده کرد. همچنین میتوانید برای تعریف توابعی که میخواهید در پایتون داشته باشید، از آن استفاده کنید.
درست است که توابع نوشته شده در سایتون با استفاده از کلیدواژه پایتون def، برای کدهای دیگر پایتون قابل دسترس هستند، اما نهایتا با محدودیتهایی در وضعیت عملکرد مواجه میگردند.
تابعهایی که برای ساخته شدن، از کلیدواژه cdef استفاده میکنند فقط و فقط برای کدهای دیگر c و cython در دسترس هستند، ولی مزیت آنها این است که سریعتر اجرا میشوند. شما میتوانید از cdef استفاده کنید و توابعی را فقط به صورت داخلی در خود ماژول سایتون فراخوانی کنید.
شما میتوانید با کلیدواژه cpdef امکان سازگاری با کدهای پایتون و کدهای C را با حداکثر سرعت فراهم کنید.
توابع cpdef نسبت به cdef کدهای بیشتری تولید میکنند اما فراخوانی کردن آنها به منابع بیشتری نیاز دارد.
سایر کلیدواژههای زبان برنامه نویسی Cython :
- از کلیدواژه ctypedef برای ارجاع به هدر فایلهای خارجی C استفاده میشود.
- برای مدیریت منابعی که برای معین کردن بخشهایی از کد که به Global Interpreter Lock پایتون نیاز دارد از کلیدواژههای Gil و nogil استفاده میشود.
- برای مراجعه به متغییرهای پیدا شده در سایر ماژولها یا توابع C ازکلیدواژههای Extern با cdef استفاده میشود.
- از کلیدواژه cimport برای نظارت بر ورودی به سایتون استفاده میشود.( نوع داده، متغییرها و تابع و نوع افزونه C ) به عنوان مثال: اپلیکیشنهای سایتون که از ماژول NumPy استفاده میکنند، از cimport برای فراهم کردن امکان دسترسی به توابع از کلیدواژه cimport استفاده میکنند.
- کلیدواژه بعدی inline است، از آن برای اینکه یک تابع را به صورت خطی تعریف کنند استفاده میشود.
- با کمک کلیدواژه Include میتوان کد منبع یک فایل سایتون را به صورتی که در C موجود است به کدهای دیگر اضافه کرد.
- برای ایجاد عباراتی در ماژول Cython که بتواند در کدهای دیگر C قابل دسترس باشد از کلیدواژه public/api استفاده میگردد. در مطالب بعدی از کلیدواژهای دیگر سایتون یاد خواهیم کرد.
کامپایل Cython
در مطالب فوق، با عملکرد برنامه ساده سایتون آشنا شدیم. حالا مراحل کامپایل کردن cython به یک فایل باینری قابل اجرا را با هم بررسی میکنیم.
ما به سه گزینه برای ساخت یک برنامه قابل اجرای سایتون نیاز داریم:
- کامپایلر C
- مفسر پایتون
- اضافه کردن سایتون به پایتون ( میتوانید با کمک گرفتن از روش مدیر پکیج pip install cython سایتون را به پایتون اضافه کنید.)
در زمان استفاده از ویندوز مایکروسافت به عنوان پلتفرم توسعه، در نظر گرفتن مورد شماره ۳ مهم است.
به دلیل اینکه ویندوز به کامپایلر C به عنوان یک ابزار استاندارد مجهز نیست ، شما باید یک کپی از Microsoft Visual Studio Community Edition برای دستیابی به این ویژگی انتخاب کنید.
پسوندی که برنامههای سایتون از آن استفاده میکنند .pyx است.
به عنوان مثال شما یک فایل با نام num.pyx در دایرکتوری جدید ایجاد کنید (که شامل فایل ایجاد شده در کد سایتون موجود در مثال بالا باشد.) و فایل دوم را با نام main.py بسازید و کد زیر را در آن بنویسید:
from num import integrate_f
print (integrate_f(1.0, 10.0, 2000))
مثال نوشته شده یک برنامه پایتون است که تابع integrate_f را در num.pyx فراخوانی میکند.
و در آخر فایلی با نام setup.py که شامل کد زیر باشد ایجاد کنید:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
ext_modules = [
Extension(
r’num’,
[r’num.pyx’]
),
]
setup(
name=’num’,
ext_modules=cythonize(ext_modules),
)
کدهای سایتون
این فایل توسط پایتون برای نصب ماژول همراه با آن استفاده میشود. در مثال بالا ما برای کامپایل کدهای سایتون از setup.py استفاده کردیم.
حال اگر شما کامپایلر C نصب شده دارید و از لینوکس استفاده میکنید، به راحتی میتوانید فایل .pyx را با اجرای کد زیر به C کامپایل کنید:
> python setup.py build_ext --inplace
اما اگر شما از ویندوز استفاده میکنید، حتما باید برای خودکارسازی فرآیند کامپایل یک فایل بچ به نام compile.bat اضافه کنید:
@SETLOCAL
set DISTUTILS_USE_SDK=1
call “C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat” amd64
python setup.py build_ext --inplace --compiler=msvc
حال اگر عمل کامپایل به درستی اجرا شود، شما فایلهای جدیدی را در دایرکتوری مشاهده خواهید کرد. دقت کنید زمانی که تغییراتی را در فایل .pyx اعمال میکنید باید مجددا آن را کامپایل کنید.
چگونه از سایتون استفاده کنیم
حال که با نحوه تبدیل کد به سایتون آشنا شدید، باید ببینیم که اپلیکیشن پایتون به چه صورت میتواند از مزیتهای cython استفاده کند و آن را به کار گیرد. میتوان گفت در چرخهها و انجام اعمال عددی نسبت به بقیه زبانهای غیر تفسیری، پایتون از کارایی پایینتری برخوردار است.
برای اینکه محاسبات عددی شما با سرعت بیشتری انجام گیرد میتوانید از انواع عددی که به C تبدیل شده استفاده کنید. هدف از بهینهکردن با سایتون کدهای پایتونی است که با کتابخانه C به طور مستقیم در ارتباط هستند.
NumPy یکی از کتابخانههای خارجی در C است که Cython به صورت مستقیم میتواند از آن بهره بگیرد.
از cimport numpy میتوان برای دسترسی سریع cython به آرایههای NumPy استفاده کرد. و نهایتا با استفاده از دستورالعملهای cdef برای مشخص کردن متغیرهای NumPy بهره گرفت.
در این مقاله سعی کردیم تا شما را با ویژگیها و کاربردهای زبان برنامه نویسی Cython آشنا کنیم تا برای یادگیری هرچه بهتر آن، پیشزمینه لازم را داشته باشید. امیدواریم این مطالب برایتان مفید بوده باشد.