آنچه در این مقاله میخوانید
نحوه افزایش سرعت اسکریپتهای پایتون با Cython
۲۶ مهر ۱۴۰۴
Cython مثل یک تقویتکننده برای پایتون است، به شما اجازه میدهد کدهای معمولی پایتون را طوری بهینه کنید که انگار با C نوشته شدهاند، بدون اینکه لازم باشد سبک برنامهنویسی خود را تغییر دهید. یعنی میتوانید هم از سادگی و راحتی پایتون لذت ببرید و هم سرعتی که همیشه دلتان میخواسته داشته باشید.
اگر با پایتون کار کرده باشید، حتما میدانید نوشتن کد با آن چقدر ساده و لذتبخش است. اما گاهی که پای محاسبات سنگین یا پردازش دادههای بزرگ وسط میآید، همان راحتی و زیبایی باعث میشود سرعت برنامهها کم شود. اینجا Cython به کمک ما میآید. در این مقاله از بلاگ لیارا، با یک مثال واقعی پیش میرویم، ایجاد یک حلقه for که روی یک لیست پایتون شامل ۱ میلیارد عدد تکرار میشود و مجموع آنها را محاسبه میکند. با توجه به اینکه زمان اجرا بهویژه در سیستمهای با منابع محدود اهمیت زیادی دارد، این موضوع را با اجرای کد پایتون در Cython روی Raspberry Pi بررسی میکنیم. نتیجهی اجرا با سایتون واقعا چشمگیر است، تفاوت سرعت مثل مقایسه یک لاکپشت با یک یوزپلنگ است، اگر میخواهید اسکریپتهای پایتونتان سریعتر و بهینهتر اجرا شوند، همراه ما باشید.
همین حالا هاست ابری Python رو سفارش بدید و پروژهتون رو با سرعت بالا راهاندازی کنید!
✅ دامنه رایگان ✅ ترافیک نامحدود ✅ هزینه ساعتی
خرید هاست ابری Python
پیشنیازها برای بهینهسازی اسکریپتهای پایتون با Cython
پیش از اینکه وارد دنیای بهینهسازی با Cython شویم، بهتر است کمی آماده باشیم. این پیشنیازها به شما کمک میکند تا مسیر یادگیری برایتان راحتتر و موثرتر باشد:
- دانش پایهای پایتون: آشنایی با سینتکس پایتون، توابع، انواع داده و ماژولها.
- درک اولیه از C/C++: مفاهیم پایهای مثل اشارهگرها (pointers)، انواع داده و ساختارهای کنترلی.
- محیط توسعه پایتون: نصب پایتون (ترجیحاً نسخه ۳.x) و داشتن یک مدیریتکننده بسته مانند pip.
- نصب Cython: با دستور
pip install cython
آن را نصب کنید. - آشنایی با ترمینال یا خط فرمان: توانایی اجرای دستورات و حرکت در مسیرهای فایلها.
با رعایت این موارد، آمادهایم تا مرحلهبهمرحله کدهای پایتون را با Cython بهینه کنیم.
آنچه در ادامه میخوانید:
- پایتون، CPython و Cython
- Cython چیست؟
- افزایش سرعت کد پایتون با سایتون
- تبدیل حلقه for پایتون به Cython
- تعیین نوع داده C برای متغیرها
- دسترسی به رزبری پای از طریق کامپیوتر
- اجرای Cython روی رزبری پای
- جمع بندی

پایتون، CPython و Cython
بسیاری از افراد نمیدانند که زبانهایی مانند پایتون با زبانهای دیگر پیادهسازی شدهاند. بهعنوان مثال، پیادهسازی پایتون با زبان C، زبان CPython نام دارد. توجه کنید که این زبان با Cython تفاوت دارد.
CPython، پیادهسازی پیشفرض و محبوبترین نسخه پایتون است و یک مزیت مهم دارد: زبان C یک زبان کامپایل شده است و کد آن به کد ماشین تبدیل میشود که مستقیما توسط واحد پردازش مرکزی (CPU) اجرا میشود. ممکن است بپرسید، اگر C کامپایل شده است، آیا پایتون هم همینطور است؟
در واقع، پیادهسازی پایتون در C (CPython) نه کاملا کامپایل شده است و نه کاملا تفسیر شده است. در فرایند اجرای یک اسکریپت پایتون هم کامپایل و هم تفسیر وجود دارد. مراحل اجرای یک اسکریپت پایتون به صورت زیر است:
- کامپایل کد منبع با استفاده از CPython برای تولید بایتکد
- تفسیر بایتکد توسط مفسر CPython
- اجرای خروجی مفسر در ماشین مجازی CPython
کامپایل زمانی اتفاق میافتد که CPython فایل منبع (.py
) را به بایتکد (.pyc
) تبدیل میکند. سپس این بایتکد توسط مفسر CPython تفسیر میشود و خروجی آن در ماشین مجازی CPython اجرا میشود. بنابراین، اجرای یک اسکریپت پایتون شامل هر دو مرحله کامپایل و تفسیر است.
کامپایلر CPython فقط یکبار بایتکد را تولید میکند، اما مفسر هر بار که کد اجرا میشود، فراخوانی میشود. معمولا مرحله تفسیر بایتکد زمانبر است. ممکن است بپرسید، اگر تفسیر سرعت اجرای کد را کم میکند، چرا از آن استفاده میکنیم؟ دلیل مهم ایناست که تفسیر کمک میکند پایتون چندسکویی (cross-platform) باشد. چون بایتکد در ماشین مجازی CPython روی CPU اجرا میشود، مستقل از سختافزار است. در نتیجه، همان بایتکد میتواند بدون تغییر روی ماشینهای مختلف اجرا شود.

اگر از مفسر استفاده نشود، کامپایلر CPython کدی تولید میکند که مستقیما روی CPU اجرا میشود. اما چون هر سیستمعامل دستورالعملهای مخصوص خود را دارد، چنین کدی چندسکویی (cross-platform) نخواهد بود و فقط روی همان سیستم قابل اجراست.

یهطور خلاصه باید بگوییم که استفاده از کامپایلر سرعت اجرای کد را افزایش میدهد، اما وجود مفسر باعث میشود کد روی سیستمعاملهای مختلف قابل اجرا باشد. یکی از دلایلی که پایتون نسبت به C کندتر است، همین استفاده از مفسر است. به یاد داشته باشید که کامپایلر فقط یک بار کد را اجرا میکند، اما مفسر هر بار که کد اجرا شود، فراخوانی میشود.
با اینکه پایتون خیلی کندتر از C است، بسیاری از برنامهنویسان هنوز آن را ترجیح میدهند، چون استفاده از آن بسیار سادهتر است. پایتون بسیاری از جزئیات پیچیده را از برنامهنویس مخفی میکند، و همین باعث میشود خطاهای برنامهنویسی کاهش پیدا کند و فرآیند دیباگ راحتتر شود.
برای مثال، پایتون یک زبان پویا (dynamically-typed) است؛ یعنی لازم نیست نوع هر متغیر را به صورت صریح مشخص کنید، پایتون خودش نوع متغیر را تشخیص میدهد. در مقابل، در زبانهای ایستا (statically-typed) مثل C، C++ یا Java، شما باید نوع متغیرها را بهطور واضح مشخص کنید.
int x = 10
string s = "Hello"
اگر کد بالا را با پیادهسازی زیر در پایتون مقایسه کنیم میبینیم که تایپ دینامیک (dynamic typing)، نوشتن کد را آسانتر میکند، اما فشار زیادی روی ماشین وارد میکند، تا نوع مناسب برای متغیرها را پیدا کند و همین باعث کندتر شدن فرآیند اجرا میشود.
x = 10
s = "Hello"
بهطور کلی، زبانهای سطح بالاتر (high-level) مانند پایتون برای توسعهدهندگان بسیار راحتتر هستند. اما وقتی کد اجرا میشود باید به دستورالعملهای سطح پائین (low-level) تبدیل شود. این کار زمان بیشتری میطلبد و این زمان صرف راحتی استفاده از زبان میشود.
اگر سرعت اجرا برایتان اهمیت دارد، باید از همان دستورالعملهای سطح پایین استفاده کنید. یعنی به جای نوشتن کد با پایتون که نقش رابط را دارد، میتوانید مستقیما با CPython بنویسید، که هسته پایتون است و با C پیادهسازی شده است. اما در این حالت، تجربه برنامهنویسی شما بیشتر شبیه C خواهد بود تا پایتون.
CPython بسیار پیچیدهتر است. در CPython همه چیز با C پیادهسازی شده و در کدنویسی نمیتوان از پیچیدگیهای C فرار کرد. به همین دلیل بسیاری از توسعهدهندگان ترجیح میدهند از Cython استفاده کنند. اما سؤال این است: Cython با CPython چه تفاوتی دارد؟ در بخش بعدی جواب این سوال را خواهیم داد.
هاست پایتون چیست؟ + راهنمای کامل خرید هاست Python
خرید هاست پایتون
Cython چیست؟
اگر بخواهیم ساده بگوییم، Cython همان پایتون است، اما با قدرت C! طبق مستندات رسمی Cython، سایتون در اصل پایتون است با اضافه شدن نوع دادههای C و چند قابلیت دیگر که به شما اجازه میدهد بخشهایی از کد را خیلی سریعتر اجرا کنید. Cython زبان پایتونی است با سینتکس اضافی برای مشخص کردن نوع متغیرها به صورت ایستا (static typing). این یعنی شما میتوانید هم از سادگی پایتون لذت ببرید و هم از سرعت خارقالعاده C بهرهمند شوید.
به عبارت دیگر، Cython بهترین ویژگیهای هر دو دنیا را به شما میدهد: راحتی و خوانایی پایتون و قدرت و سرعت C. شما میتوانید همچنان کدهای معمولی پایتون بنویسید، اما وقتی نیاز شد، بخشهای سنگین و زمانبر را با سینتکس شبیه C بهینه کنید. نتیجه چیست؟ یک فایل که ترکیبی از کد پایتون و کد شبیه C دارد و سرعت آن به طور چشمگیری بالاتر است.
فایلهای معمولی پایتون پسوند .py
دارند، اما فایلهای Cython با پسوند .pyx
ذخیره میشوند. شما میتوانید همان کد پایتون را داخل .pyx
بنویسید، اما در همین فایل میتوانید از قابلیتهای قدرتمند Cython هم استفاده کنید. فقط کپی کردن کد پایتون داخل .pyx
کمی سرعت اجرا را بهتر میکند، اما اگر نوع متغیرها را هم مشخص کنید، تفاوت سرعت واقعاً قابل توجه خواهد بود.
در این حالت، کمی برنامهنویسی سختتر میشود، اما در عوض زمان اجرا به شکل شگفتانگیزی کاهش مییابد. اگر تجربه کار با C را داشته باشید، کار کردن با Cython برای شما مثل آب خوردن خواهد بود!
راهنمای جامع استفاده از جستجوی شبکهای Grid Search در پایتون python
جستجوی شبکهای Grid Search در پایتون python
افزایش سرعت کد پایتون با سایتون
برای تبدیل کد پایتون به Cython، ابتدا یک فایل با پسوند .pyx
ایجاد کنید، نه پسوند معمولی .py
. شما میتوانید در این فایل همان کدهای استاندارد پایتون را بنویسید. اما یادتان باشد که تمام قابلیتهای پایتون بهطور کامل در Cython پشتیبانی نمیشوند. برای لیست کامل محدودیتها، میتوانید به راهنمای محدودیتهای Cyhton مراجعه کنید.
قبل از ادامه، مطمئن شوید که Cython نصب شده است. برای نصب آن میتوانید از دستور زیر استفاده کنید:
pip install cython
برای تولید فایل .pyd
در ویندوز یا .so
در لینوکس و macOS که همان ماژول کامپایلشدهای است که بعداً میتوانید آن را وارد (import) کنید، ابتدا باید فایل Cython خود را کامپایل کنید. این کار با استفاده از یک فایل setup.py انجام میشود.
یک فایل setup.py ایجاد کنید و کد زیر را در آن قرار دهید. در این اسکریپت، از تابع distutils.core.setup()
همراه با Cython.Build.cythonize()
برای کامپایل فایل .pyx
استفاده میکنیم.
تابع cythonize()
مسیر فایل .pyx
که میخواهید کامپایل شود را میگیرد. در این مثال فرض میکنیم که فایل setup.py
و فایل Cython ما یعنی test_cython.pyx
در یک فولدر قرار دارند.
import distutils.core
import Cython.Build
distutils.core.setup(
ext_modules = Cython.Build.cythonize("test_cython.pyx"))
برای کامپایل فایل Cython، دستور زیر را در Command Prompt اجرا کنید. دقت داشته باشید که دایرکتوری فعلی Command Prompt باید همان پوشهای باشد که فایل setup.py
در آن قرار دارد.
python setup.py build_ext --inplace
پس از اجرای این دستور، دو فایل در کنار فایل .pyx
ایجاد میشوند.
- فایل اول با پسوند
.c
خواهد بود. - فایل دوم با پسوند
.pyd
(یا مشابه آن، بسته به سیستمعامل شما) ساخته میشود.
برای استفاده از فایل تولید شده، کافی است ماژول test_cython
را import کنید و پیام "Hello Cython"
به طور مستقیم نمایش داده خواهد شد، همانطور که در زیر مشاهده میکنید.

اکنون با موفقیت کد پایتون را به Cython تبدیل کردیم. در بخش بعدی، به سراغ Cython کردن یک فایل .pyx
میرویم که شامل یک حلقه (loop) است.
تبدیل حلقه for پایتون به Cython
حال بیایید کاری که قبلاً در مقدمه مطرح شد را بهینه کنیم: یک حلقه for
که روی ۱ میلیون عدد تکرار میشود و مجموع آنها را محاسبه میکند. ابتدا تمرکز خود را بر کارایی خود حلقهها میگذاریم.
برای اندازهگیری مدت زمان اجرا، از ماژول time
استفاده میکنیم تا ببینیم اجرای حلقه چقدر طول میکشد.
import time
t1 = time.time()
for k in range(1000000):
pass
t2 = time.time()
t = t2-t1
print("%.20f" % t)
در فایل .pyx
، میانگین زمان اجرای حلقه در ۳ بار تکرار برابر با ۰.۰۲۸۱ ثانیه است. این آزمایش روی سیستمی با مشخصات Core i7-6500U CPU با فرکانس ۲.۵ گیگاهرتز و ۱۶ گیگابایت حافظه DDR3 انجام شده است.
اگر این زمان را با اجرای همان حلقه در یک فایل معمولی پایتون مقایسه کنیم، میانگین زمان برابر با ۰.۰۴۱۱ ثانیه است. این یعنی Cython برای خود حلقهها حدود ۱.۴۶ برابر سریعتر از پایتون است، حتی بدون اینکه لازم باشد حلقه for
را تغییر دهیم تا با سرعت C اجرا شود.
سپس عمل جمع کردن اعداد را هم اضافه کنیم. برای این کار از تابع range()
استفاده میکنیم.
import time
t1 = time.time()
total = 0
for k in range(1000000):
total = total + k
print "Total =", total
t2 = time.time()
t = t2-t1
print("%.100f" % t)
دقت کنید که هر دو اسکریپت همان نتیجه را برمیگردانند: یعنی ۴۹۹۹۹۹۵۰۰۰۰۰. در پایتون، اجرای این محاسبه در میانگین ۰.۱۱۸۳ ثانیه طول میکشد (میانگین از سه بار آزمایش). در Cython، این عملیات ۱.۳۵ برابر سریعتر انجام میشود و میانگین زمان اجرا برابر با ۰.۰۸۷۵ ثانیه است.
حالا بیایید یک مثال دیگر را بررسی کنیم، جایی که حلقه از ۰ تا ۱ میلیارد عدد تکرار میشود.
import time
t1 = time.time()
total = 0
for k in range(1000000000):
total = total + k
print "Total =", total
t2 = time.time()
t = t2-t1
print("%.20f" % t)
اسکریپت Cython تقریباً در ۸۵ ثانیه (۱.۴ دقیقه) اجرا شد، در حالی که اسکریپت پایتون حدود ۱۱۵ ثانیه (۱.۹ دقیقه) طول کشید. در هر دو حالت، این زمان برای یک کار نسبتاً ساده خیلی طولانی است. پس چه فایدهای دارد که از Cython استفاده کنیم اگر اجرای آن بیش از یک دقیقه طول بکشد؟ نکته اینجاست که این مشکل اشتباه ماست، نه Cython.
همانطور که پیشتر گفتیم، نوشتن کد پایتون داخل فایل .pyx
یک بهبود اولیه است، اما زمان اجرا را به شکل چشمگیری کاهش نمیدهد. برای افزایش سرعت، باید تغییراتی در کد پایتون داخل اسکریپت Cython اعمال کنیم. اولین و مهمترین نکته این است که نوع داده (data type) متغیرها را به صورت واضح مشخص کنیم.
بهترین هاست پایتون ایران و خارج چیست؟
هاست پایتون ایران و خارج
تعیین نوع داده C برای متغیرها
بر اساس کدی که در قسمت قبل نوشتیم، پنج متغیر استفاده شده است: ، k
، t1
، t2
و t
. در حالت عادی، پایتون نوع دادهی این متغیرها را بهصورت ضمنی تشخیص میدهد، اما همین فرایند زمانبر است و باعث کندی اجرا میشود.
برای صرفهجویی در این زمان بهتر است نوع دادهها را بهصورت صریح و با استفاده از نوع دادههای زبان C مشخص کنیم.
در این مثال:
- متغیر
k
از نوع int تعریف میشود. - متغیرهای
t1
،t2
وt
همگی از نوع float در نظر گرفته میشوند.
import time
cdef unsigned long long int total
cdef int k
cdef float t1, t2, t
t1 = time.time()
for k in range(1000000000):
total = total + k
print "Total =", total
t2 = time.time()
t = t2-t1
print("%.100f" % t)
دقت کنید که در آخرین دستور print
، مقدار precision روی ۱۰۰ تنظیم شده است و همهی اعداد نمایش داده شده صفر هستند. این همان چیزی است که باید از Cython انتظار داشته باشیم.
در حالی که اجرای کد در پایتون بیش از ۱.۹ دقیقه طول میکشد، در Cython زمان اجرا آنقدر ناچیز است که عملا هیچ زمانی صرف نمیشود. حتی نمیشود گفت سرعت Cython فقط هزار یا حتی صد هزار برابر بیشتر از پایتون است؛ چون هر بار که دقت نمایش زمان را بالاتر بردیم، باز هم هیچ عددی ظاهر نشد!

نکته: شما میتوانید یک متغیر از نوع عدد صحیح (int) هم برای نگهداری مقداری که به تابع range()
داده میشود ایجاد کنید. این کار باعث افزایش بیشتر سرعت اجرا خواهد شد. در کد جدید (که در ادامه آمده)، مقدار ورودی ابتدا در متغیر maxval
از نوع int
ذخیره میشود.
import time
cdef unsigned long long int maxval
cdef unsigned long long int total
cdef int k
cdef float t1, t2, t
maxval=1000000000
t1=time.time()
for k in range(maxval):
total = total + k
print "Total =", total
t2=time.time()
t = t2-t1
print("%.100f" % t)
حالا که دیدیم چطور میتوانیم با کمک Cython سرعت اجرای اسکریپتهای پایتون را بالا ببریم، وقت آن رسیده که همین تکنیک را روی Raspberry Pi (RPi) امتحان کنیم.
دسترسی به رزبری پای از طریق کامپیوتر
اگر اولین بار است که از Raspberry Pi استفاده میکنید، باید آن را به شبکه متصل کنید تا از طریق کامپیوتر شخصی به آن دسترسی داشته باشید. سادهترین راه این است که هم PC و هم Raspberry Pi را به یک سوئیچ یا مودم وصل کنید. در این حالت، سرویس DHCP بهطور خودکار برای هر دستگاه یک آدرس IP اختصاص میدهد.
حالا برای اتصال به رزبری پای لازم است آدرس IPv4 آن را بدانید. شاید بپرسید چطور باید بفهمیم آدرس IP رزبری پای من چیست؟ نگران نباشید. با استفاده از یک ابزار اسکن IP میتوانید استفاده کنید. این ابزار یک بازه از آدرسهای IPv4 را میگیرد، شبکه را اسکن میکند و لیست دستگاههای فعال را همراه با اطلاعات آنها به شما نشان میدهد.

در این مرحله، برای اینکه ابزار اسکن بتواند دستگاهها را پیدا کند، باید محدودهی آدرسهای IPv4 شبکهتان را وارد کنید. اگر نمیدانید محدودهاش چیست، کافیست دستور زیر را اجرا کنید:
- در ویندوز: دستور
ipconfig
- در لینوکس: دستور
ifconfig
این دستور، آدرس IP سیستم خودتان را نشان میدهد.
مثال:
- آدرس IPv4 لپتاپ من:
192.168.43.177
- Subnet Mask:
255.255.255.0
با این اطلاعات متوجه میشویم که محدودهی IP در شبکه از 192.168.43.1
تا 192.168.43.255
میباشد.
نکاتی برای آدرس IP:
- آدرس
192.168.43.1
معمولا به Gateway (مودم/روتر) اختصاص دارد. - آدرس
192.168.43.255
هم برای پیامهای Broadcast رزرو شده است.
بنابراین بهتر است محدودهی جستجو را از 192.168.43.2
شروع کنید و تا 192.168.43.254 ادامه دهید.

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

برای اینکه از راه دور به رزبریپای دسترسی پیدا کنیم، از SSH استفاده میکنیم. این کار را با برنامهی MobaXterm انجام میدهیم که محیط بسیار سادهای برای برقراری اتصال دارد.

برای ایجاد اتصال SSH، روی دکمه Session در گوشهی بالا سمت چپ برنامه کلیک کنید. یک پنجره جدید باز میشود، همانطور که در تصویر زیر مشاهده میکنید.

در این پنجره، روی دکمه SSH در بالای سمت چپ کلیک کنید تا پنجرهی جدیدی باز شود، مانند تصویر زیر.
سپس کافی است:
- آدرس IPv4 رزبریپای را وارد کنید.
- نام کاربری را وارد کنید (بهطور پیشفرض
pi
است).
در آخر، روی ok کلیک کنید تا اتصال SSH برقرار شود و بتوانید از راه دور با رزبریپای کار کنید.

پس از کلیک روی ok، پنجرهای جدید باز میشود و از شما رمز عبور خواسته میشود. رمز عبور پیشفرض رزبریپای raspberrypi
است.
بعد از ورود موفق، پنجرهی اصلی MobaXterm ظاهر میشود:
- پنل سمت چپ به شما کمک میکند تا به راحتی بین دایرکتوریهای رزبریپای حرکت کنید.
- در کنار آن، یک خط فرمان (Command Line) وجود دارد که میتوانید دستورات خود را مستقیماً وارد کنید.

اجرای Cython روی رزبری پای
برای نوشتن کد مثال آخر، یک فایل جدید بسازید و پسوند آن را .pyx
بگذارید. در پنل سمت چپ، گزینههایی برای ایجاد فایل و فولدرهای جدید وجود دارد. برای راحتتر شدن کار، میتوانید از New File استفاده کنید. همانطور که در تصویر زیر نشان داده شده است.
یک فایل به نام test_cython.pyx
در دایرکتوری اصلی رزبریپای ایجاد کردیم.

روی فایل دوبار کلیک کنید تا باز شود، سپس کد مورد نظر را داخل آن جایگذاری کرده و ذخیره کنید. بعد از آن باید فایل setup.py
را بسازیم که دقیقا مانند توضیحاتی است که قبلا دادیم. در مرحله بعد، دستور زیر را اجرا کنید تا فایل Cython کامپایل و آماده استفاده شود.
python3 setup.py build_ext --inplace
پس از اجرای موفقیتآمیز این دستور، میتوانید فایلهای خروجی را در پنل سمت چپ مشاهده کنید. توجه داشته باشید که پسوند ماژول قابل وارد کردن اکنون .so
است. به این علت که دیگر از ویندوز استفاده نمیکنیم و روی رزبریپای هستیم.

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

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