کامپایل کد پایتون با Nuitka

پایتون یک زبان مفسری (اسکریپتی)هست یعنی هر بار که کد رو اجرا میکنید روالی طی میشه که در نهایت کد ماشین تولید و اجرا میشه و این پروسه هر بار تکرار میشه و این برخلاف زبان های کامپایلی هست، در زبان های کامپایلی در مرحله آخر کد ماشین ایجاد و در فایل اجرایی ذخیره میشه و شما کافیه اون فایل رو اجرا کنید و این روال های ترجمه دیگه لام نیست هر دفعه اجرا بشه.

وقتی یکی کد پایتونی رو اجرا میکنید مفسر استاندارد پایتون (CPython) کدها رو به بایت کد ترجمه میکنه و خروجی رو به Python Virtual Machine میده بعد PVM بایت کد رو به کد ماشین(دستورات سطح پایین CPU) تبدیل و اون رو اجرا میکنه.

معایب زبان های مفسری

  • کند بودن اجرا برنامه به علت اجرا عملیات های تکراری تبدیل به کد ماشین
  • در دسترس بودن کد منبع

 

برای اینکه یک برنامه پایتون رو کامپایل کنیم چند تا ابزار وجود داره مثل RPython ,Cython و Nuitka

ما تو این پست Nuitka رو بررسی میکنیم.

 

Nuitka

این ابزار کد پایتونی رو به کد C ترجمه و خروجی رو توسط یک کامپایلر C مثل gcc یا ++g به کد ماشین تبدیل میکنه.

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

این همون روشی هست که اکثر برنامه های نوشته شده با C کامپایل میشن.

با کامپایل کد به وسیله Nuitka علاوه بر غیر دسترس کردن کد منبع، سرعت اجرای کد پایتون (در برخی موارد) هم افزایش پیدا میکنه.

برای مثال نتیجه اجرای تابع فیبوناچی عدد ۳۸ رو ببینید

کد اصلی

و اجرا

 

کد کامپایل شده با Nuitka حدود ۲۰۷ درصد سریعتر از اجرای مستقیم کد با پایتون اجرا شد.

 

کامپایل کد پایتون با Nuitka

برای کامپایل با Nuitka ابتدا اون رو نصب میکنیم

 

این برنامه چند تا سوییچ مهم داره

  • follow-imports– یعنی تمام ماژول های استفاده شده در کد رو به صورت اتوماتیک پیدا و در فایل خروجی قرار بده.
  • standalone– این سوییچ همون کار follow-imports– رو انجام میده به علاوه اینکه خود مفسر پایتون رو هم در خروجی قرار میده به این ترتیب رو سیستمی که قرار کد کامپایل شده اجرا بشه، نیاز نیست پایتون نصب شده باشه.

وقتی از این سوییچ استفاده میکنید یک سری فایل کتابخونه هم ایجاد میشه که اگه رو لینوکس کامپایل کنید فایلهای so. و رو ویندوز فایلهای dll. خواهد بود.

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

در لینوکس برای اینکه کاری کنید که سیستم عامل کتابخونه های مورد نظرتون رو بازگزاری کنه دو راه دارید

1. کپی کردن کتابخونه ها به  usr/lib/

2. اضافه کردن مسیر کتابخونه به متغیر محیطی LD_LIBRARY_PATH به اینصورت

 

  • module– برای کامپایل یک ماژول هست، خروجی این سوییچ یک فایل کتابخونه هست که میتونید اون رو در کدهاتون import کنید، دقت کنید که ماژولتون باید فایل setup داشته باشه.
  • remove-output– حدف کدهای C ایجاد شده که نیازی هم بهشون ندارید
  • output-dir– مشخص کردن خروجی

مستندات خود Nuitka رو هم ببینید