پروفائلنگ ٹولز کے ساتھ اپنے ازگر کوڈ کو کیسے بہتر بنائیں

Prwfaylng Wlz K Sat Apn Azgr Kw Kw Kys B Tr Bnayy



Python کوڈ کی کارکردگی کو بڑھانا ڈویلپرز کے لیے ایک قابل قدر مہارت ہے۔ اس معاملے میں پروفائلنگ ٹولز ضروری ہیں اور کوڈ کی پابندیوں اور ناکاریوں کا پتہ لگانے میں سہولت فراہم کرتے ہیں۔ یہ مضمون ازگر کے پروگراموں کو بہتر بنانے کے لیے پروفائلنگ ٹولز کے استعمال کے طریقوں کی جانچ کرتا ہے۔ عمل درآمد کے اوقات، میموری کی کھپت، اور تعدد کی فنکشن کال کی پیمائش میں مہارت حاصل کرکے، ہم ٹھیک ٹھیک بہتر بنا سکتے ہیں۔

پروفائلنگ ٹولز کے ساتھ ازگر کوڈ کو بہتر بنانا

Python کوڈ کو پروفائلنگ ٹولز کے ساتھ بہتر بنانے کے لیے Google Colab کو ترتیب دینا، ہم Google Colab ماحول ترتیب دے کر شروع کرتے ہیں۔ اگر ہم Colab میں نئے ہیں، تو یہ ایک لازمی، طاقتور کلاؤڈ بیسڈ پلیٹ فارم ہے جو Jupyter نوٹ بک اور Python لائبریریوں کی ایک رینج تک رسائی فراہم کرتا ہے۔ ہم (https://colab.research.google.com/) پر جا کر اور ایک نئی Python نوٹ بک بنا کر Colab تک رسائی حاصل کرتے ہیں۔

پروفائلنگ لائبریریاں درآمد کریں۔

ہماری اصلاح پروفائلنگ لائبریریوں کے ماہرانہ استعمال پر منحصر ہے۔ اس تناظر میں دو اہم لائبریریاں cProfile اور line_profiler ہیں۔







درآمد سی پروفائل

درآمد line_profiler

'cProfile' لائبریری پروفائلنگ کوڈ کے لیے ایک بلٹ ان Python ٹول ہے، جب کہ 'line_profiler' ایک بیرونی پیکیج ہے جو ہمیں کوڈ لائن کا بذریعہ تجزیہ کرتے ہوئے اور بھی گہرائی میں جانے کی اجازت دیتا ہے۔



اس مرحلے میں، ہم ایک نمونہ ازگر اسکرپٹ بناتے ہیں تاکہ ایک تکراری فنکشن کا استعمال کرتے ہوئے فبونیکی ترتیب کا حساب لگائیں۔ آئیے اس عمل کا مزید گہرائی میں تجزیہ کریں۔ فبونیکی ترتیب نمبروں کا ایک مجموعہ ہے جس میں ہر ایک لگاتار نمبر اس سے پہلے کے دو نمبروں کا مجموعہ ہے۔ یہ عام طور پر 0 اور 1 سے شروع ہوتا ہے، لہذا ترتیب 0، 1، 1، 2، 3، 5، 8، 13، 21، وغیرہ کی طرح دکھائی دیتی ہے۔ یہ ایک ریاضیاتی ترتیب ہے جو عام طور پر اس کی تکراری نوعیت کی وجہ سے پروگرامنگ میں بطور مثال استعمال ہوتی ہے۔



ہم ایک Python فنکشن کی وضاحت کرتے ہیں جسے 'Fibonacci' کہا جاتا ہے ریکرسیو فبونیکی فنکشن میں۔ یہ فنکشن اپنی دلیل کے طور پر ایک 'n' عدد لیتا ہے، جو فبونیکی ترتیب میں اس پوزیشن کی نمائندگی کرتا ہے جس کا ہم حساب لگانا چاہتے ہیں۔ ہم فبونیکی ترتیب میں پانچویں نمبر کو تلاش کرنا چاہتے ہیں، مثال کے طور پر، اگر 'n' 5 کے برابر ہے۔





def فبونیکی ( n ) :

اگلا، ہم ایک بیس کیس قائم کرتے ہیں. تکرار میں ایک بنیادی کیس ایک ایسا منظر نامہ ہے جو کالوں کو ختم کرتا ہے اور پہلے سے طے شدہ قدر لوٹاتا ہے۔ فبونیکی ترتیب میں، جب 'n' 0 یا 1 ہے، تو ہم نتیجہ پہلے ہی جانتے ہیں۔ 0 ویں اور 1st Fibonacci نمبر بالترتیب 0 اور 1 ہیں۔

اگر n <= 1 :

واپسی n

یہ 'اگر' بیان اس بات کا تعین کرتا ہے کہ آیا 'n' 1 سے کم ہے یا اس کے برابر۔ اگر ایسا ہے تو، ہم خود 'n' واپس کر دیتے ہیں، کیونکہ مزید تکرار کی ضرورت نہیں ہے۔



تکراری حساب کتاب

اگر 'n' 1 سے زیادہ ہے، تو ہم تکراری کیلکولیشن کے ساتھ آگے بڑھتے ہیں۔ اس صورت میں، ہمیں '(n-1)'ویں اور '(n-2)'ویں فبونیکی نمبروں کا خلاصہ کرکے 'n' -th Fibonacci نمبر تلاش کرنے کی ضرورت ہے۔ ہم فنکشن کے اندر دو بار بار آنے والی کالیں کرکے یہ حاصل کرتے ہیں۔

اور :

واپسی فبونیکی ( n - 1 ) + فبونیکی ( n - 2 )

یہاں، 'fibonacci(n-1)' '(n-1)'ویں فبونیکی نمبر کا حساب لگاتا ہے، اور 'fibonacci(n - 2)' '(n-2)'ویں فبونیکی نمبر کا حساب لگاتا ہے۔ ہم 'n' پوزیشن پر مطلوبہ فبونیکی نمبر حاصل کرنے کے لیے ان دو قدروں کو شامل کرتے ہیں۔

خلاصہ طور پر، یہ 'فبونیکی' فنکشن بار بار فبونیکی نمبروں کو چھوٹے ذیلی مسائل میں توڑ کر حساب کرتا ہے۔ یہ دوبارہ آنے والی کالیں کرتا ہے جب تک کہ یہ بیس کیسز (0 یا 1) تک نہ پہنچ جائے، معلوم قدروں کو واپس کرتا ہے۔ کسی بھی دوسرے 'n' کے لیے، یہ '(n-1)' اور '(n-2)' کے لیے دو تکراری کالوں کے نتائج کو جمع کرکے فبونیکی نمبر کا حساب لگاتا ہے۔

اگرچہ یہ عمل فبونیکی نمبرز کا حساب لگانے کے لیے سیدھا ہے، لیکن یہ سب سے زیادہ کارآمد نہیں ہے۔ بعد کے مراحل میں، ہم پروفائلنگ ٹولز کا استعمال کریں گے تاکہ عمل درآمد کے بہتر اوقات کے لیے اس کی کارکردگی کی پابندیوں کی شناخت اور اسے بہتر بنایا جا سکے۔

CProfile کے ساتھ کوڈ کی پروفائلنگ

اب، ہم 'cProfile' کو ملازمت دے کر اپنے 'fibonacci' فنکشن کو پروفائل کرتے ہیں۔ یہ پروفائلنگ مشق ہر فنکشن کال کے ذریعے استعمال ہونے والے وقت کی بصیرت فراہم کرتی ہے۔

cprofiler = سی پروفائل۔ پروفائل ( )

cprofiler. فعال ( )

نتیجہ = فبونیکی ( 30 )

cprofiler. غیر فعال ( )

cprofiler. پرنٹ_اعداد و شمار ( ترتیب دیں = 'مجموعی' )

اس سیگمنٹ میں، ہم ایک 'cProfile' آبجیکٹ کو شروع کرتے ہیں، پروفائلنگ کو چالو کرتے ہیں، 'n=30' کے ساتھ 'fibonacci' فنکشن کی درخواست کرتے ہیں، پروفائلنگ کو غیر فعال کرتے ہیں، اور اعداد و شمار ظاہر کرتے ہیں جو مجموعی وقت کے حساب سے ترتیب دیے جاتے ہیں۔ یہ ابتدائی پروفائلنگ ہمیں ایک اعلیٰ سطحی جائزہ فراہم کرتی ہے کہ کون سے افعال سب سے زیادہ وقت خرچ کرتے ہیں۔

! pip install line_profiler

درآمد سی پروفائل

درآمد line_profiler

def فبونیکی ( n ) :

اگر n <= 1 :

واپسی n

اور :

واپسی فبونیکی ( n - 1 ) + فبونیکی ( n - 2 )

cprofiler = سی پروفائل۔ پروفائل ( )

cprofiler. فعال ( )

نتیجہ = فبونیکی ( 30 )

cprofiler. غیر فعال ( )

cprofiler. پرنٹ_اعداد و شمار ( ترتیب دیں = 'مجموعی' )

مزید تفصیلی تجزیہ کے لیے لائن_پروفائلر کے ساتھ لائن کے لحاظ سے کوڈ لائن کو پروفائل کرنے کے لیے، ہم اپنی کوڈ لائن کو لائن کے لحاظ سے تقسیم کرنے کے لیے 'line_profiler' کا استعمال کرتے ہیں۔ 'line_profiler' استعمال کرنے سے پہلے، ہمیں پیکیج کو Colab ریپوزٹری میں انسٹال کرنا چاہیے۔

! pip install line_profiler

اب جب کہ ہمارے پاس 'line_profiler' تیار ہے، ہم اسے اپنے 'fibonacci' فنکشن پر لاگو کر سکتے ہیں:

%load_ext line_profiler

def فبونیکی ( n ) :

اگر n <= 1 :

واپسی n

اور :

واپسی فبونیکی ( n - 1 ) + فبونیکی ( n - 2 )

%lprun -f فبونیکی فبونیکی ( 30 )

یہ ٹکڑا 'line_profiler' ایکسٹینشن لوڈ کرنے سے شروع ہوتا ہے، ہمارے 'fibonacci' فنکشن کی وضاحت کرتا ہے، اور آخر میں 'n=30' کے ساتھ 'fibonacci' فنکشن کو پروفائل کرنے کے لیے '%lprun' کا استعمال کرتا ہے۔ یہ عمل درآمد کے اوقات کی لائن بہ لائن سیگمنٹیشن پیش کرتا ہے، بالکل واضح کرتا ہے کہ ہمارا کوڈ اپنے وسائل کہاں خرچ کرتا ہے۔

نتائج کا تجزیہ کرنے کے لیے پروفائلنگ ٹولز کو چلانے کے بعد، اسے اعداد و شمار کی ایک صف کے ساتھ پیش کیا جائے گا جو ہمارے کوڈ کی کارکردگی کی خصوصیات کو ظاہر کرتا ہے۔ ان اعدادوشمار میں ہر فنکشن کے اندر خرچ ہونے والا کل وقت اور کوڈ کی ہر لائن کی مدت شامل ہوتی ہے۔ مثال کے طور پر، ہم یہ فرق کر سکتے ہیں کہ فبونیکی فنکشن ایک جیسی قدروں کو متعدد بار دوبارہ شمار کرنے میں تھوڑا زیادہ وقت لگاتا ہے۔ یہ بے کار حساب ہے اور یہ ایک واضح علاقہ ہے جہاں اصلاح کا اطلاق کیا جا سکتا ہے، یا تو یادداشت کے ذریعے یا تکراری الگورتھم کو استعمال کر کے۔

اب، ہم آپٹیمائزیشن بناتے ہیں جہاں ہم نے اپنے فبونیکی فنکشن میں ممکنہ اصلاح کی نشاندہی کی۔ ہم نے دیکھا کہ فنکشن ایک ہی فبونیکی نمبروں کو متعدد بار دوبارہ گنتی ہے، جس کے نتیجے میں غیر ضروری فالتو پن اور عمل درآمد کا وقت سست ہوتا ہے۔

اس کو بہتر بنانے کے لیے، ہم یادداشت کو نافذ کرتے ہیں۔ میموائزیشن ایک اصلاحی تکنیک ہے جس میں پہلے شمار کیے گئے نتائج (اس معاملے میں، فبونیکی نمبرز) کو ذخیرہ کرنا اور دوبارہ گنتی کرنے کے بجائے ضرورت پڑنے پر دوبارہ استعمال کرنا شامل ہے۔ یہ فالتو حسابات کو کم کرتا ہے اور کارکردگی کو بہتر بناتا ہے، خاص طور پر فبونیکی ترتیب جیسے تکراری افعال کے لیے۔

اپنے فبونیکی فنکشن میں میموائزیشن کو لاگو کرنے کے لیے، ہم درج ذیل کوڈ لکھتے ہیں:

# کمپیوٹیڈ فبونیکی نمبرز کو ذخیرہ کرنے کے لیے ڈکشنری
fib_cache = { }
def فبونیکی ( n ) :
اگر n <= 1 :
واپسی n
# چیک کریں کہ آیا نتیجہ پہلے ہی محفوظ ہے۔
اگر n میں fib_cache:
واپسی fib_cache [ n ]
اور :
# حساب لگائیں اور نتیجہ کیش کریں۔
fib_cache [ n ] = فبونیکی ( n - 1 ) + فبونیکی ( n - 2 )
واپسی fib_cache [ n ] ,

'fibonacci' فنکشن کے اس ترمیم شدہ ورژن میں، ہم پہلے سے شمار کیے گئے Fibonacci نمبروں کو ذخیرہ کرنے کے لیے 'fib_cache' ڈکشنری متعارف کراتے ہیں۔ فبونیکی نمبر کا حساب لگانے سے پہلے، ہم چیک کرتے ہیں کہ آیا یہ پہلے سے کیشے میں ہے۔ اگر ایسا ہے تو، ہم کیش شدہ نتیجہ واپس کرتے ہیں۔ کسی اور صورت میں، ہم اس کی گنتی کرتے ہیں، اسے کیشے میں رکھتے ہیں، اور پھر اسے واپس کرتے ہیں۔

پروفائلنگ اور اصلاح کو دہرانا

اصلاح کو نافذ کرنے کے بعد (ہمارے معاملے میں یادداشت)، ہماری تبدیلیوں کے اثرات کو جاننے کے لیے پروفائلنگ کے عمل کو دہرانا اور اس بات کو یقینی بنانا ضروری ہے کہ ہم نے کوڈ کی کارکردگی کو بہتر بنایا ہے۔

اصلاح کے بعد پروفائلنگ

ہم انہی پروفائلنگ ٹولز کا استعمال کر سکتے ہیں، 'cProfile' اور 'line_profiler'، آپٹمائزڈ Fibonacci فنکشن کو پروفائل کرنے کے لیے۔ پروفائلنگ کے نئے نتائج کا پچھلے نتائج سے موازنہ کرکے، ہم اپنی اصلاح کی تاثیر کی پیمائش کر سکتے ہیں۔

یہاں یہ ہے کہ ہم 'cProfile' کا استعمال کرتے ہوئے آپٹمائزڈ 'فبونیکی' فنکشن کو کیسے پروفائل کر سکتے ہیں:

cprofiler = سی پروفائل۔ پروفائل ( )

cprofiler. فعال ( )

نتیجہ = فبونیکی ( 30 )

cprofiler. غیر فعال ( )

cprofiler. پرنٹ_اعداد و شمار ( ترتیب دیں = 'مجموعی' )

'line_profiler' کا استعمال کرتے ہوئے، ہم اسے لائن بہ لائن پروفائل کرتے ہیں:

%lprun -f فبونیکی فبونیکی ( 30 )

کوڈ:

# کمپیوٹیڈ فبونیکی نمبرز کو ذخیرہ کرنے کے لیے ڈکشنری
fib_cache = { }

def فبونیکی ( n ) :
اگر n <= 1 :
واپسی n
# چیک کریں کہ آیا نتیجہ پہلے ہی محفوظ ہے۔
اگر n میں fib_cache:
واپسی fib_cache [ n ]
اور :
# حساب لگائیں اور نتیجہ کیش کریں۔
fib_cache [ n ] = فبونیکی ( n - 1 ) + فبونیکی ( n - 2 )
واپسی fib_cache [ n ]
cprofiler = سی پروفائل۔ پروفائل ( )
cprofiler. فعال ( )

نتیجہ = فبونیکی ( 30 )

cprofiler. غیر فعال ( )
cprofiler. پرنٹ_اعداد و شمار ( ترتیب دیں = 'مجموعی' )
%lprun -f فبونیکی فبونیکی ( 30 )

اصلاح کے بعد پروفائلنگ کے نتائج کا تجزیہ کرنے کے لیے، عملدرآمد کے اوقات میں نمایاں طور پر کمی آئے گی، خاص طور پر بڑی 'n' اقدار کے لیے۔ یادداشت کی وجہ سے، ہم مشاہدہ کرتے ہیں کہ فنکشن اب فبونیکی نمبروں کو دوبارہ گننے میں بہت کم وقت صرف کرتا ہے۔

یہ اقدامات اصلاح کے عمل میں ضروری ہیں۔ اصلاح میں ہمارے کوڈ میں ان مشاہدات کی بنیاد پر باخبر تبدیلیاں کرنا شامل ہے جو پروفائلنگ سے حاصل کیے جاتے ہیں، جبکہ پروفائلنگ کو دہرانا یقینی بناتا ہے کہ ہماری اصلاح سے کارکردگی میں متوقع بہتری آتی ہے۔ تکراری پروفائلنگ، اصلاح اور توثیق کے ذریعے، ہم بہتر کارکردگی فراہم کرنے اور اپنی ایپلی کیشنز کے صارف کے تجربے کو بڑھانے کے لیے اپنے Python کوڈ کو ٹھیک کر سکتے ہیں۔

نتیجہ

اس مضمون میں، ہم نے اس مثال پر تبادلہ خیال کیا جہاں ہم نے Google Colab ماحول میں پروفائلنگ ٹولز کا استعمال کرتے ہوئے Python کوڈ کو بہتر بنایا۔ ہم نے سیٹ اپ کے ساتھ مثال کی ابتدا کی، ضروری پروفائلنگ لائبریریوں کو درآمد کیا، نمونے کے کوڈز لکھے، اسے 'cProfile' اور 'line_profiler' دونوں کا استعمال کرتے ہوئے پروفائل کیا، نتائج کا حساب لگایا، اصلاح کو لاگو کیا، اور کوڈ کی کارکردگی کو بار بار بہتر کیا۔