معرفی زبان برنامه نویسی پایتون
در این قسمت در یک پاراگراف به معرفی پایتون میپردازیم.
پایتون به سرعت خود را به یکی از محبوبترین زبانهای برنامهنویسی در جهان مبدل ساخت. پایتون در رتبه یک یا دو فهرست وب سایت TIOBE قرار دارد. زبان پایتون برای علوم داده و یادگیری ماشین، مهندسی نرم افزار و حتی توسعه وب استفاده میشود. دلایل زیادی برای محبوبیت و گسترش پایتون وجود دارد.
دلایل محبوبیت و گسترش پایتون
اول از همه، پایتون یک زبان برنامهنویسی سطح بالا است. این ویژگی پایتون باعث میشود که یادگیری زبان، فوقالعاده آسان شود.
نکته دیگری که باید به آن اشاره کرد، اکوسیستم خارقالعاده پایتون است. در حالی که اکثر زبانهای مشابه دیگر، معمولاً کمتر از پنجاه هزار بسته ثبت شده دارند، پایتون حدود دویست هزار بسته دارد. بستههای پایتون برای استفاده در زمینههای مختلف ایجاد شدهاند. این ویژگی به این معناست که پایتون یکی از همه کارهترین زبانهایی است که امروزه مورد استفاده قرار میگیرد. اما خب، علیرغم این که پایتون یک اکوسیستم عالی برای استفاده از زبان دارد، این نکته را باید درنظر گرفت که هیچ زبانی بدون ایراد نیست.
هم رویش منتشر کرده است:
آموزش پایتون Python (برنامه نویسی پایتون مقدماتی تا پیشرفته )
با وجود سینتکس برنامهنویسی سطح بالا و ماهیت ساده برنامهنویسی پایتون، باید گفت که پایتون یک زبان برنامهنویسی مفسری است. کدهاي پايتون به جای اینکه کامپایل شود، توسط یک زبان برنامهنویسی کامپایلشده -که در این مورد زبان برنامه نویسی C است- خوانده میشود. C يک زبان برنامهنویسی سطح پایین و استاندارد است. پایتون به طور کلی با بسیاری از زبانهای دیگر که با C کار میکنند کنار میآید. در واقع، میتوانید پایتون را از C بنویسید.
7 روش آسان برای افزایش سرعت پایتون
در هر زبان برنامهنویسی مفسری، همیشه نگرانی از بحث سرعت وجود دارد و در مورد پایتون نیز استثنا نیست. اگرچه پایتون در مقایسه با سایر زبانهای مفسری زبان بسیار سریعی است. اما هنوز با سرعت برخی موارد سطح پایینتر مانند C یا ++C مطابقت ندارد. به نظر میرسد سرعت پاشنه آشیل پایتون باشد. این زبان دارای نقاط قوت بسياري است، اما سرعت عموماً بزرگترین ضعف آن تلقی میشود. با این حال، برخی از تکنیکهای ساده وجود دارد که میتواند به سرعت اجرا در پایتون کمک کند.
1- ماژول Itertools
تکرار چیزی است که میتواند سرعت محاسبات را به میزان قابل توجهی کُند کند. به ویژه در زبانهایی مانند پایتون در مورد هر حلقهای صدق میکند. پایتون از برنامهنويسی چندنخی پشتیبانی میکند. به طور کلی سينتکس برای کنترل نخها و فرآیندها کمی بیش از حد اعلان است تا بتوان آنها را به همان اندازه که در سایر زبانهای برنامهنویسی موثر است کنترل کرد. از آنجا که پایتون تکنخی است، تکرار میتواند کل برنامه را در حین کار روی حلقه متوقف کند.
یک ماژول مناسب که در کتابخانه استاندارد پایتون برای سرعت بخشیدن به این تکنیکهای حلقه گنجانده شده است، ماژول itertools است. ماژول itertools دارای ابزارهایی برای حلقه سریع با پیاده سازی متناوب C است که به جاي Python.h توسط بستههای دیگر ارائه میشود. این توابع معمولاً باعث تکرار سریعتر میشوند.
2- Threads
یکی دیگر از روشها در کتابخانه استاندارد برای افزایش سرعت پایتون، استفاده از چندنخی (Multi-threadng) است. پایتون به عنوان یک زبان برنامهنویسی تکنخی و سطح بالا ساخته شده است. بنابراین در بسیاری از موارد انجام چند نخ در پایتون دشوار خواهد بود. در اکثر مثالها نخ، یک فراخوانی ساده برای ایجاد یک فرایند جدید است.
بزرگترین مشکلی که در استفاده از نخها در پایتون وجود دارد این است که فرایندها بدون نام هستند و قابل مدیریت نیستند. میتوانید در حالی که کارهای دیگر را انجام میدهید، فرآیندهایی را برای حلقهها و محاسبات خود ایجاد کنید. اما فراخوانی مجدد، و مدیریت آنچه آنها انجام میدهند دشوار است. البته، یکی از مواردی که میتواند برای برنامهنویس معمولی پایتون مفید باشد اين است که در بیشتر موارد فراخوانی و مديريت لازم نخواهد بود. میتوان با import کردن ماژول threading از کتابخانه استاندارد پایتون، از نخ يا thread استفاده کرد:
import threading
در مرحله بعد باید یک تابع برای نخ جدید هدف بنويسيد:
import time as ti
def sleeper():
ti.sleep(5)
print("Hello")
حالا میتوان یک شیء جدید از کلاس Thread ساخت:
x = threading.Thread(target = sleeper)
همچنین میتوان از آرگومان کلیدی تابع برای تعیین هدف خود استفاده کنید. اگر تابع نياز به آرگومان دارد، میتوانید کلمه کليدی args را اضافه کنید.
import time as ti
def sleeper(n):
ti.sleep(n)
print("Hello")x = threading.Thread(target = sleeper, args = (5))
thread را با Thread.start () اجرا کنید:
x.start()
نیازی به گفتن نیست که انجام دو کار همزمان میتواند در سرعت بخشیدن به کد بسیار موثر باشد. اگرچه پیادهسازی چندنخی در پایتون بزرگترین کار نیست ، اما مطمئناً ارزش فهميدن و استفاده را دارد!
3- Numba
کامپایل Just In Time یا کامپایل JIT یک تکنیک کامپایل است که باعث میشود کد تفسیرشده، اجرا و همزمان کامپایل شود. هر زمان که یک برنامه پایتون را کامپایل میکنید، در نظر بگیرید که مقدار مشخصی از سربار وجود دارد که در آن دادهها برای همه چیز در کد نياز به ثبت و تخصيص داده دارند. هر زمان که این اشیاء فراخوانی شوند، پایتون در هر محدوده رفرنسی برای آن دارد. برای کاهش این سربار می توان از کامپایل JIT استفاده کرد.
با کامپایل JIT، به جای تخصیص همه این دادهها قبل از اجرای برنامه، همانطور که برنامه در حال اجرا است آنرا انجام میدهید. اين کار باعث کاهش زمان شروع اجرا میشود. و درست مانند انجام بیش از یک کار در یک زمان است که مورد بحث ماست، انجام بیش از یک کار در یک زمان هنگام کامپایل میتواند سرعت کد را نیز بطور قابل توجهی افزایش دهد.
بسته ای که معمولاً برای این کار در پایتون استفاده میشود، Numba است. نکته جالب در مورد اجرای Numba این است که استفاده از آن فوق العاده آسان است. Numba از یک دکوراتور ساده برای اجازه دادن به Python برای فعال کردن JIT در توابع و کلاسهای خاص استفاده میکند.
4- Cython
یکی دیگر از گزینههای محبوب در مورد سرعت اجرا در پایتون، Cython است. Cython روشی است که میتوانید از سرعت C، بدون دانستن یا نوشتن کد زبان C استفاده کنید. البته به سرعت خود C نيست. اما روشی عالی برای پایبندی به پایتون و در عین حال سرعت بخشیدن به اجرا است.
بسیاری از برنامهنویسان به Cython به عنوان یک راهحل قوی برای سرعت پایتون نگاه میکنند. اما احتمالا اين ديدگاه درست نيست. Cython برای همه چیز در Python کار نخواهد کرد.
هم رویش منتشر کرده است:
آموزش Cython پروژه محور ــــــ افزایش سرعت پایتون با سایتون
موارد زیادی وجود دارد که پایتون نمیتواند به درستی Cythonize کند. اما همیشه این امکان براي استفاده وجود دارد. نکته مهمی که باید در نظر بگیرید اين است که مدیریت وابستگیها به Cython نیز میتواند یک کابوس باشد. میتوان تابع cythonize از ماژول Cython.Build از بسته Cython را import کنید.
البته این ماژول در کتابخانه استاندارد وجود ندارد، بنابراین باید آنرا بصورت جداگانه نصب کنيد. همچنین باید یک setup از ابزارهای کتابخانه استاندارد setuptools ایجاد کنید، حال هر دو را import میکنيم:
from setuptools import setup
from Cython.Build import cythonize
باید یک فایل ساخت Cython بسازید که معمولاً setup.py نامیده میشود. بعد از آن میتوان تابع cythonize را با کد زير فراخوانی کرد:
setup(
ext_modules = cythonize("example.pyx")
)
همچنین هر ماژول پایتون را که با آن کار میکنید به جای .py به صورت .pyx نامگذاری کنید. در نهایت، برای ایجاد Cython، از رابط خط فرمان پایتون استفاده کنيد، مانند این کد:
python setup.py build_ext --inplace
این فایل در حال حاضر یک فایل باینری کامپایلشده است که میتوانید، آن را به سادگی import کرده و همانطور که در پایتون انتظار دارید استفاده کنید.
5- محاسبات موازی
راه حل دیگری که میتوانید انتخاب کنید محاسبات موازی است. محاسبات موازی قدرت یک کارت گرافیک را با قدرت پردازندههای کامپیوتری ترکیب میکند. قبل از استفاده از محاسبات موازی، همیشه باید در نظر بگیرید که پردازنده گرافیکی در واقع چه کاری انجام میدهد.
پردازندههای گرافیکی تجهیزات تخصصی هستند که برای کارهای خاصی بسیار خوب هستند. و برای کارهایی دیگر کارايی بد دارند. به عبارت دیگر، بدون APU یک پردازنده گرافیکی جالب نخواهد بود. همانطور که، یک پردازنده مرکزی نمی تواند عملکرد یک پردازنده گرافیکی را داشته باشد.
همچنین باید در نظر بگیرید که پردازندههای گرافیکی در کار با آرایههای بزرگ عددی خوب عمل میکنند. یعنی استفاده از آنها در محاسبات آماری در یادگیری ماشین بسیار عالی است.
بنابراین در بسیاری از موارد علم داده، محاسبات موازی میتواند افزایش قابل توجه سرعت را بدنبال داشته باشد. پیشتر به استفاده از کامپایل JIT Numba برای افزایش سرعت کد پرداخته بودیم. اما بسته Numba ابزارهایی برای برنامه نویسی CUDA ارائه میدهد. البته این ابزارها برای کارتهای گرافیکی انویدیا است.
from numba import cuda
برای استفاده از CUDA باید متغیر محیطی را export کنید. اگر نمیخواهید این متغیر در هر بار استفاده از Bash شما اعلان شود، میتوانید این کد را به سادگی در یک ترمینال قرار دهید:
export NUMBA_ENABLE_CUDASIM=1
مانند JIT ، Numba به سادگی از یک دکوراتور برای تعیین اینکه آیا تابعی از CUDA استفاده میکند یا نه، بهره میبرد. حتی میتوان CUDA و JIT را برای نتایج سریعتر ترکیب کرد!
from numba import cuda
@cuda.jit
def example(io_array):
print(io_array)
اکنون که محاسبات موازی را شناختید، باید در نظر بگیرید که کاستیهایی در پایتون وجود دارد که محاسبات موازی یکی از آنهاست. کار با CUDA در پایتون همیشه دشوارتر از سایر زبانها خواهد بود، زیرا اساسا این زبان، با در نظر گرفتن محاسبات موازی ساخته نشده است.
نکته دیگر این است که برای استفاده از محاسبات موازی به یک واحد پردازش گرافیکی نیاز دارید. کارتهای گرافیک یکی از گرانترین سخت افزارهای کامپیوتر هستند. بدست آوردن یک کارت گرافیک مناسب برای کمک به اجرای سریع کد میتواند دشوار باشد. لذا همین نکته می تواند نقطه ضعف این روش باشد.
6- FuncTools
روش دیگری که استفاده از آن فوقالعاده آسان است FuncTools است. این ماژول در کتابخانه استاندارد پایتون موجود است و آنقدر همه کاره است که میتوان همه چیز را در آن پوشش داد. دکوراتورهای زیادی که این بسته ارائه میدهد میتواند در سرعت اجرای کد موثر باشد. یا سینتکس کد را کاربر پسندتر کند. Functools مطمئناً بسته ای است که ارزش یادگیری دارد.
همانطور که اشاره کردیم، FuncTools تواناییهای زیادی دارد. به عنوان مثال، این بسته میتواند پایتون را مجبور به استفاده از تکارسالی کند، که انواع آن همراه با توابع مورد استفاده قرار می گیرد. این ماژول همچنین با فراهم کردن یک دکوراتور ذخیره سازی این امکان را میدهد مقادیر در پایتون را برای استفاده بعدی ذخیره کنید، که برای تابعی که در کد استفاده میشود بسیار مفید است.
7- C
اگر هیچ یک از این راه حلها برای شما کار نمیکند، میتوانید به صورت متناوب وارد C شوید. یکی از بزرگترین ویژگیهای پایتون این است که در C ساخته شده است.
بنابراین C میتواند به عنوان جایگزینی برای زبان در مواقعی که سرعت مورد نیاز است استفاده شود. همچنین نیازی به نوشتن کل کد در C ندارید و میتوانید از طریق پایتون کد C را فراخوانی کنید. البته، این مورد گزینه چشمگیری نسبت به سایر راه حلهای موجود در این لیست خواهد بود. C یک زبان عالی است، اما ضرورت استفاده از آن باعث میشود در نوشتن کد زمان زیادی صرف شود.
نتیجه
پایتون اخیراً به دلایل مختلف بسیار محبوب شده و انتخابی عالی برای برنامههای یادگیری ماشین است. یادگیری ماشین میتواند در سخت افزار دشوار باشد.
پایتون اغلب در مقایسه با زبانهای کامپایلری مانند C و ++C دچار مشکلاتی است. با این حال، با استفاده از این تکنیکهایی که گفته شد میتوانید به راحتی سرعت پایتون را به صورت چشمگیری افزایش دهید. و سرعت عملکرد آن را در مشکلات خاص بسیار نزدیک به سرعت C برسانید.
کلیدواژگان
ماژول itertools – افزایش سرعت پایتون – افزایش سرعت در پایتون – سرعت پایتون – روش های سرعت اجرا در پایتون – روش های سرعت اجرای در پایتون – سرعت اجرای پایتون – سرعت اجرا در پایتون – افزایش سرعت اجرای کد در پایتون – معرفی پایتون – معرفی زبان پایتون – معرفی زبان برنامه نویسی پایتون – محاسبات موازی در پایتون – ماژول itertools – پردازش موازی در پایتون – محاسبات موازی پایتون – پردازش موازی پایتون – ماژول itertools در پایتون – itertools در پایتون
منبع
5-easy-ways-to-speed-up-python
دوره های آموزشی مرتبط
- آموزش نامپای NumPy --- دانشمند داده شوید! ۹۲,۰۰۰ تومان
- آموزش وب اسکریپینگ با پایتون از صفر ــ بسته مقدماتی ۱۶۵,۰۰۰ تومان
6 دیدگاه برای “افزایش سرعت پایتون __7 روش آسان برای افزایش سرعت اجرای پایتون ”
سلام.ممنون از مقاله خوبتان.
از خدمت شما و مهندس آصفی دوتا سوال داشتم.1- آیا برای اجرای الگوریتم های پردازش تصویر و شبکه های دیپ ،مانند اجرای کتابخانه opencv و اجرای الگوریتم yolo بصورت ریل تایم استفاده از cython گزینه مناسبی است؟ 2-ایا سایتون همه کتابخانه های مورد نیاز برای opencv و دیپ لرنینگ را پشتیبانی می کند. 3- اگر پاسخ منفی است بفرمایید بهترین راهکار برای افزایش سرعت اجرای کد نوشته شده برای الگوریتم هایی مانند یولو و حوزه دیپ و پردازش تصویر چیه؟ در نظر داشته باشید که به GPU دسترسی نداریم. با سپاس فراوان
سلام وقت بخیر. لطفا سوال تخصصی رو تو بخش آموزش ها ارسال کنید. چون این بخش رو بنده خیلی دیر می بینم و شرمنده میشم.
بهترین راه این هست که بعد از این که کارتون تو پایتون با opencv انجام شد و نتیجه لازم رو گرفتین برای افزایش سرعت اگه از جی پی یو نمی تونید استفاده کنید فقط می تونید کدها رو با opencv و زبان سی بازنویسی کنید. همون تابع ها هست. سایتون یا cpython هم ایده بدی نیستن ولی بنده تجربه ای ندارم و نمی دونم که چقدر موفق هستن تو این زمینه.
مقاله مفید با قلم شیوا. دست شما درد نکنه.
متشکرم
بسیار عالی و کامل
ممنونم. موفق باشید