افزایش پرفورمنس پایتون ( قسمت اول cython )

به احتمال زیاد اگه با پایتون درگیر بوده باشید ، تا حالا از بقیه همکارا و دوستای غیر پایتونیتون (!) تیکه هایی شنیدید که زبان کندیه . این حرف هم درسته و هم غلط. سرعت پایتون کاملا به نحوه کد نویسی و ماژول هایی که شما ازشون استفاده میکنید بستگی داره.

طی این سری از مقاله ها میخوایم روش هایی رو با هم بررسی کنیم تا به کد بیس پایتونی خودمون سرعت اضافه کنیم. این قسمت به ابزار بی نظیری به اسم Cython میپردازه که پشت خیلی از کتابخونه های درست حسابی و به اصطلاح های پرفورمنس پایتون خوابیده.

هدف سایتون اینه که به عنوان واسطه ای بین ++c/c و پایتون عمل کنه . کتابخونه های بزرگ ، سریع و بالغ دنیای تحلیل دیتا مثل Numpy , Pandas و scikit-learn همگی از بهینه سازی های کد های c استفاده میکنن و وقتی شما اونا رو فرامیخونید، در واقع دارید از قدرت سی و سی پلاس پلاس استفاده میکنید.

خب قدم اول برای داشتن یه ماژول سایتونی اینه که اطلاعات typing رو به کد خودتون اضافه کنید

ما تو پایتون به چنین چیزی عادت داریم:

x = 5.0

چیزی که سایتون ازتون توقع داره اینه :

cdef float x = 5.0

و درست مثل زبان های استاتیک تایپ ، شما باید به نوع متغیری که تعریفش کردید پایبند بمونید.

برای اجرای یه اسکریپت سایتونی به دو تا مرحله نیاز دارید:

  • نصب cython با pip
  • نصب کامپایلر سی / سی پی پی

اگه لینوکس دارید که کارتون حله ، توی مک می تونید ایکس کد رو نصب کنید و توی ویندوز یکم دردسر خواهید کشید :(

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

از فانکشن تستی زیر استفاده میکنیم:

برخی از دیتا تایپ های سایتون عبارتند از :

  • cdef int x,y,z
  • cdef char *s
  • cdef float x = 5.2 (single precision)
  • cdef double x = 40.5 (double precision)
  • cdef list languages
  • cdef dict abc_dict
  • cdef object thing

حالا اسکیریپت دوم رو با تغییراتی که میدیم به صورت pyx. سیو میکنیم

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

python setup.py build_ext --inplace

حالا باید یه فایل c. و یه فایل so. داشته باشیم و میتونیم این اکستنشن سی مون رو ایمپورت کنیم

#testing.py
import example_cython

example_cython.test(5)

برای مقایسه سرعت به ماژول معروف timeit متوصل میشیم

نوبت اجرا و مقایسس:

 $ python3 testing_things.py 
0.0002787369999168732 0.04767731600031766
Cython is 171.04767581819533x faster 

171 بار سریع تر ! پس از این به بعد لوپ هایی رو که عملگر های ریاضی دارند رو به سایتون بسپارید.

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

این نوشته ترجمه و نقل آزادی از این سایت وزین بود.

شاد باشید!