اجرای کدهای فورترن داخل پایتون

سلام ، میلاد هستم.

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

برای این کار لازمه که با ابزار F2PY آشنا بشیم. اگر بخوام خیلی ساده بگم ، این ابزار رابطی مابین زبان پایتون و فورترن میسازه تا ما بتونیم کدهای فورترنی خودمون رو داخل زبان پایتون استفاده کنیم(ولی از لحاظ فنی موضوع خیلی پیچیده ست). F2PY بخشی از کتابخونه ی numpy هست که مطمئنم همه ی افرادی که رفتن سراغ حوزه هوش مصنوعی ، یادگیری ماشین و دیتاساینس با اون آشنا هستن. همچنین این ابزار بصورت یک ابزار مستقل خط فرمانی هم برای سیستم های لینوکسی وجود داره .همونطور که میدونید فورترن یک زبان کامپایلری هست که بیشتر برای برنامه نویسی علمی و محاسبات عددی استفاده میشه و کتابخونه های نرم افزاری خیلی قوی ای با این زبان نوشته شدن مثل lapack و intel math kernel library. خیلی از مواقع مخصوصا توی پروژه های بزرگ پایتونی بجای اینکه بیایم و ابزارهای مورد نیازمون رو از صفر به زبان پایتون بنویسیم ، میایم و ابزارهای نوشته شده به زبان فورترن داخل پروژه ی خودمون استفاده میکنیم ؛ بدون اینکه کاربر متوجه بشه ابزاری که داره استفاده میکنه به زبان فورترن هست نه پایتون. با این کار هم زمان هدر نمیره بخاطر توسعه پروژه و هم سرعت برنامه افزایش پیدا میکنه(سرعت فورترن از پایتون بیشتره).



ساخت extension module :

خب بریم سراغ اصل مطلب. فرض کنید که تابع فورترنی زیر رو داریم:

even_odd.f90
even_odd.f90

تابع بالا یک مقدار صحیح رو دریافت میکنه و بعد مشخص میکنه که مقدار داده شده زوج هست یا فرد.

ابزار F2PY امکانات و روش های مختلفی برای کار کردن داره ولی ما اینجا آسون ترین و راحت ترین روش رو بررسی میکنیم. برای اینکار دستور زیر رو داخل ترمینال وارد میکنیم:

python  - m  numpy.f2py  - c  even_odd.f90  - m  even_odd_module

دستور بالا فایل فورترنی مارو (even_odd.f90)پردازش میکنه و بعد یک extension module برای پایتون با نام even_odd_module تولید میکنه. بعد از اجرا شدن دستور خواهید دید که یک فایل جدید با پسوند .so داخل دایرکتوری ساخته شده.



تست ماژول:

خب حالا میریم سراغ تست کردن ماژول داخل زبان پایتون. مفسر پایتون رو اجرا میکنیم و ماژول رو ایمپورت میکنیم:

>>>  from even_odd_module  import even_odd

میخوایم بدونیم که این ماژولی که ایمپورت کردیم در واقع چه چیزی هست و به کدوم کلاس تعلق داره:

>>>  print(even_odd)
<fortran object>
>>>  print(type(even_odd))
<class 'fortran'>

حالا میخوایم داکیومنت مربوط به تابع فورترنی رو بررسی کنیم :

>>>  print(even_odd.__doc__)
even_odd(number)

Wrapper for  ``even_odd``.

Parameters
-------------------
number   :   input  int

و در آخر میخوایم تابع مورد نظر رو با دادن ورودی تست کنیم ببینیم درست کار میکنه یا نه:

>>> even_odd(5)
5  is  an  odd  number
>>> even_odd(10)
10  is  an  even  number

اینم از تست کردن این ماژول (:



اینم اینجا داخل پرانتز بگم که بیشتر امکانات و توابع موجود توی کتابخونه ی numpy و ماژول جبر خطی کتابخونه ی scipy مدیون یک کتابخونه ی نوشته شده با زبان فورترن بنام lapack هستن و دارن از توابع اون استفاده میکنن.

کلام آخر:

اگر به این موضوع علاقه مند شدید و خواستید که بیشتر در این مورد یاد بگیرید و یا کار کنید ، پیشنهاد میکنم حتما مستندات ابزار F2PY رو مطالعه کنید.

امیدوارم مفید بوده باشه براتون ، موفق باشید.