۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

PyPy چیست؟ پایتون سریعتر بدون درد

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

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

Python به دلیل قدرتمند بودن، انعطاف پذیر بودن و کار کردن با آن آسان شهرت یافته است. این فضیلت ها منجر به استفاده از آن در انواع وسیع و رو به رشد برنامه ها، گردش کارها و زمینه ها شده است. اما طراحی زبان – ماهیت تفسیر شده و پویایی زمان اجرا – به این معنی است که پایتون همیشه نسبت به زبان‌های بومی ماشین مانند C یا C++ کندتر بوده است.

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

اما راه‌حل‌ها هرگز ایده‌آل نیستند. آیا عالی نیست اگر بتوانیم یک برنامه پایتون موجود را همانطور که هست بگیریم و آن را به طرز چشمگیری سریعتر اجرا کنیم؟ این دقیقاً همان کاری است که می توانید با PyPy انجام دهید.

ویدئوی مرتبط: استفاده از زمان اجرا PyPy برای Python

PyPy در مقابل CPython

PyPy جایگزینی برای مفسر استوک پایتون، CPython است. در حالی که CPython پایتون را به بایت کد میانی کامپایل می کند که سپس توسط یک ماشین مجازی تفسیر می شود، PyPy از کامپایل در زمان (JIT) برای ترجمه کد پایتون به زبان اسمبلی بومی ماشین استفاده می کند.

بسته به وظیفه ای که انجام می شود، افزایش عملکرد می تواند چشمگیر باشد. به طور میانگین (هندسی)، PyPy سرعت پایتون را حدود ۴.۷ برابر نسبت به Python 3.7 افزایش می‌دهد، با برخی از وظایف شتاب ۵۰ بار یا بیشتر در حالی که بهینه‌سازی‌های JIT از انواع خاصی به نسخه‌های جدید مفسر CPython اضافه می‌شوند، دامنه و قدرت آن‌هایی که PyPy در حال حاضر انجام می‌دهد، نیستند. (این احتمال  ممکن است را در آینده رد نمی کند، اما فعلاً اینطور نیست.)

Ignite 2022: Azure را به مرکز توسعه خود تبدیل کنید

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

PyPy در حال حاضر از Python 2 و Python 3 از طریق تجسم های مختلف پروژه پشتیبانی می کند. به عبارت دیگر، بسته به نسخه پایتونی که اجرا می کنید، باید نسخه های مختلف PyPy را دانلود کنید. شاخه Python 2 PyPy بسیار طولانی‌تر بوده است، اما نسخه Python 3 اخیراً سریع‌تر شده است. در حال حاضر از نسخه های پایتون تا ۳.۹ پشتیبانی می کند و پایتون ۳.۱۰ به صورت آزمایشی پشتیبانی می شود.

علاوه بر پشتیبانی از تمام زبان اصلی پایتون، PyPy با اکثر ابزارهای موجود در اکوسیستم پایتون، مانند pip برای بسته‌بندی یا virtualenv برای مجازی کار می‌کند. محیط ها اکثر بسته های پایتون، حتی آنهایی که دارای ماژول C هستند، باید همانطور که هست کار کنند. با این حال محدودیت هایی وجود دارد که به زودی در مورد آنها صحبت خواهیم کرد.

نحوه عملکرد PyPy

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

طرح OpenJDK ثابت های محاسبه شده را به جاوا اضافه می کند

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

PyPy همچنین از روشی که CPython برخی از توابع داخلی را مدیریت می کند، فاصله می گیرد، اما سعی می کند رفتارهای سازگار را حفظ کند. به عنوان مثال، PyPy جمع آوری زباله را متفاوت از CPython مدیریت می کند. همه اشیا بلافاصله پس از خارج شدن از محدوده جمع آوری نمی شوند، بنابراین یک برنامه پایتون که تحت PyPy اجرا می شود ممکن است ردپای حافظه بزرگتری نسبت به زمانی که تحت CPython اجرا می شود نشان دهد. اما همچنان می‌توانید از کنترل‌های سطح بالای جمع‌آوری زباله پایتون که از طریق ماژول gc در معرض دید قرار گرفته‌اند، استفاده کنید، مانند gc.enable()، gc.disable()، و gc.collect().

اگر اطلاعاتی در مورد رفتار JIT PyPy در زمان اجرا می‌خواهید، PyPy شامل یک ماژول است، pypyjit، که بسیاری از قلاب های JIT را در معرض برنامه پایتون شما قرار می دهد. اگر عملکرد یا ماژولی دارید که به نظر می‌رسد با JIT ضعیف عمل می‌کند، pypyjit به شما امکان می‌دهد آمار دقیقی در مورد آن به دست آورید.

یک ماژول خاص PyPy، __pypy__، سایر ویژگی‌های خاص را نشان می‌دهد به PyPy، که می تواند برای نوشتن برنامه هایی که از این ویژگی ها استفاده می کنند مفید باشد. به دلیل پویایی زمان اجرا پایتون، می‌توان برنامه‌های پایتون ساخت که از این ویژگی‌ها در زمانی که PyPy وجود دارد استفاده می‌کنند و در صورت نبود آن‌ها را نادیده می‌گیرند.

محدودیت های PyPy

چون PyPy جادویی به نظر می رسد، جادو نیست. PyPy جایگزینی کاملاً جهانی برای زمان اجرا استوک CPython نیست. برخی از محدودیت‌های آن، کارایی آن را برای انواع خاصی از برنامه‌ها کاهش می‌دهد یا از بین می‌برد. بیایید مهمترین آنها را در نظر بگیریم.

PyPy با برنامه‌های پایتون خالص بهترین عملکرد را دارد

PyPy همیشه با برنامه‌های Python خالص بهترین عملکرد را داشته است – یعنی برنامه‌های نوشته شده در پایتون و هیچ چیز دیگری. بسته‌های پایتون که با کتابخانه‌های C مانند NumPy ارتباط دارند، به دلیل روشی که PyPy از رابط‌های باینری بومی CPython تقلید می‌کند، عملکرد خوبی نداشته است.

توسعه دهندگان PyPy از این مشکل چشم پوشی کرده اند و PyPy را با اکثر بسته های Python که به پسوندهای C وابسته هستند سازگارتر کرده اند. به عنوان مثال، NumPy اکنون با PyPy بسیار خوب کار می کند. اما اگر می‌خواهید حداکثر سازگاری با برنامه‌های افزودنی C داشته باشید، از CPython استفاده کنید.

PyPy با برنامه‌های طولانی‌تر کار می‌کند

یکی از عوارض جانبی نحوه بهینه سازی برنامه های پایتون توسط PyPy این است که برنامه های طولانی تر از بهینه سازی های آن بیشترین بهره را می برند. هر چه برنامه طولانی تر اجرا شود، PyPy اطلاعات نوع زمان اجرا بیشتری را می تواند جمع آوری کند و بهینه سازی های بیشتری می تواند انجام دهد. اسکریپت های پایتون یکباره از این نوع چیزها سودی نخواهند برد. برنامه‌هایی که سود می‌برند معمولاً حلقه‌هایی دارند که برای مدت طولانی اجرا می‌شوند یا به طور مداوم در پس‌زمینه اجرا می‌شوند—مثلاً چارچوب‌های وب.

PyPy کامپایل قبل از زمان را انجام نمی دهد

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

اگر می خواهید پایتون را در کدهای سریع تری کامپایل کنید که می تواند به عنوان یک برنامه مستقل اجرا شود، از Cython، Cython استفاده کنید. ="http://numba.pydata.org/" rel="nofollow">Numba، یا Nuitka آزمایشی فعلی  پروژه.