ٹائمائٹ اور سی پروفائل کا استعمال کرتے ہوئے ازگر کوڈ کی پروفائلنگ - KDnuggets

ٹائمائٹ اور سی پروفائل کا استعمال کرتے ہوئے ازگر کوڈ کی پروفائلنگ - KDnuggets

ماخذ نوڈ: 2874649

ٹائمائٹ اور سی پروفائل کا استعمال کرتے ہوئے ازگر کوڈ کی پروفائلنگ
مصنف کی طرف سے تصویر
 

ایک سافٹ ویئر ڈویلپر کے طور پر، آپ نے غالباً یہ اقتباس سنا ہوگا۔ "وقت سے پہلے اصلاح تمام برائیوں کی جڑ ہے"آپ کے کیریئر میں ایک بار سے زیادہ۔ اگرچہ چھوٹے منصوبوں کے لیے اصلاح بہت مددگار (یا بالکل ضروری) نہیں ہوسکتی ہے، لیکن پروفائلنگ اکثر مددگار ثابت ہوتی ہے۔ 

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

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

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

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

  • la reversed() فنکشن، اور
  • فہرست کاٹنا. 
>>> nums=[6,9,2,3,7]
>>> list(reversed(nums))
[7, 3, 2, 9, 6]
>>> nums[::-1]
[7, 3, 2, 9, 6]

 

کمانڈ لائن پر ٹائمٹ چل رہا ہے۔

آپ چلا سکتے ہیں۔ timeit نحو کا استعمال کرتے ہوئے کمانڈ لائن پر:

$ python -m timeit -s 'setup-code' -n 'number' -r 'repeat' 'stmt'

 

آپ کو بیان فراہم کرنے کی ضرورت ہے۔ stmt جن کی پھانسی کا وقت ناپا جانا ہے۔ 

آپ وضاحت کر سکتے ہیں۔ setup کوڈ جب ضرورت ہو - مختصر آپشن -s یا طویل آپشن - سیٹ اپ کا استعمال کرتے ہوئے۔ سیٹ اپ کوڈ صرف ایک بار چلایا جائے گا۔

۔ number بیان چلانے کے لیے اوقات: مختصر آپشن -n یا طویل آپشن -نمبر اختیاری ہے۔ اور اس چکر کو دہرانے کی تعداد: مختصر آپشن -r یا طویل آپشن -repeat بھی اختیاری ہے۔

آئیے اپنی مثال کے طور پر مندرجہ بالا کو دیکھیں:

یہاں فہرست بنانا ہے۔ setup کوڈ اور فہرست کو تبدیل کرنا وہ بیان ہے جس کا وقت مقرر کیا جانا ہے:

$ python -m timeit -s 'nums=[6,9,2,3,7]' 'list(reversed(nums))'
500000 loops, best of 5: 695 nsec per loop

 

جب آپ اقدار کی وضاحت نہیں کرتے ہیں۔ repeat5 کی ڈیفالٹ ویلیو استعمال ہوتی ہے۔ اور جب آپ وضاحت نہیں کرتے number، کوڈ کو ضرورت کے مطابق کئی بار چلایا جاتا ہے تاکہ کل وقت تک پہنچ سکے۔ کم از کم 0.2 سیکنڈ.

یہ مثال واضح طور پر بیان پر عمل کرنے کے لئے اوقات کی تعداد کا تعین کرتی ہے:

$ python -m timeit -s 'nums=[6,9,2,3,7]' -n 100Bu000 'list(reversed(nums))'
100000 loops, best of 5: 540 nsec per loop

 

کی ڈیفالٹ قدر repeat 5 ہے، لیکن ہم اسے کسی بھی مناسب قیمت پر سیٹ کر سکتے ہیں:

$ python3 -m timeit -s 'nums=[6,9,2,3,7]' -r 3 'list(reversed(nums))'
500000 loops, best of 3: 663 nsec per loop

 

آئیے لسٹ سلائسنگ اپروچ کو بھی وقت دیں:

$ python3 -m timeit -s 'nums=[6,9,2,3,7]' 'nums[::-1]'
1000000 loops, best of 5: 142 nsec per loop

 

ایسا لگتا ہے کہ فہرست کو کاٹنے کا طریقہ تیز تر ہے (تمام مثالیں اوبنٹو 3.10 پر ازگر 22.04 میں ہیں)۔

ایک ازگر اسکرپٹ میں ٹائمٹ چل رہا ہے۔

Python اسکرپٹ کے اندر ٹائمٹ چلانے کے مساوی یہ ہے:

import timeit setup = 'nums=[9,2,3,7,6]'
number = 100000
stmt1 = 'list(reversed(nums))'
stmt2 = 'nums[::-1]' t1 = timeit.timeit(setup=setup,stmt=stmt1,number=number)
t2 = timeit.timeit(setup=setup,stmt=stmt2,number=number) print(f"Using reversed() fn.: {t1}")
print(f"Using list slicing: {t2}")

 

۔ timeit() کال قابل عمل درآمد کا وقت لوٹاتا ہے۔ stmt لیے number اوقات کی یاد رکھیں کہ ہم واضح طور پر اس بات کا ذکر کر سکتے ہیں کہ کتنی بار چلنا ہے، یا بنانا ہے۔ number 1000000 کی ڈیفالٹ ویلیو لیں۔

Output >>
Using reversed() fn.: 0.08982690000000002
Using list slicing: 0.015550800000000004

 

یہ بیان کو چلاتا ہے — ٹائمر فنکشن کو دہرائے بغیر — مخصوص کے لیے number اوقات کا اور پھانسی کا وقت لوٹاتا ہے۔ اس کا استعمال بھی کافی عام ہے۔ time.repeat() اور کم از کم وقت لیں جیسا کہ دکھایا گیا ہے:

import timeit setup = 'nums=[9,2,3,7,6]'
number = 100000
stmt1 = 'list(reversed(nums))'
stmt2 = 'nums[::-1]' t1 = min(timeit.repeat(setup=setup,stmt=stmt1,number=number))
t2 = min(timeit.repeat(setup=setup,stmt=stmt2,number=number)) print(f"Using reversed() fn.: {t1}")
print(f"Using list slicing: {t2}")

 

یہ کوڈ کو چلانے کے عمل کو دہرائے گا۔ number اوقات کی repeat اوقات کی تعداد اور کم از کم عملدرآمد کا وقت لوٹاتا ہے۔ یہاں ہمارے پاس 5 بار کی 100000 تکرار ہیں۔

Output >>
Using reversed() fn.: 0.055375300000000016
Using list slicing: 0.015101400000000043

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

یہ ہمیں تمام فنکشنز اور میتھڈ کالز کے ایگزیکیوشن اوقات فراہم کرے گا — بشمول بلٹ ان فنکشنز اور طریقے۔ لہذا ہم زیادہ مہنگی فنکشن کالز کا بہتر اندازہ حاصل کر سکتے ہیں اور اصلاح کے مواقع کی نشاندہی کر سکتے ہیں۔ مثال کے طور پر: ایک API کال ہو سکتی ہے جو بہت سست ہے۔ یا کسی فنکشن میں ایک لوپ ہو سکتا ہے جسے مزید Pythonic سمجھ کے اظہار سے تبدیل کیا جا سکتا ہے۔ 

آئیے سیکھتے ہیں کہ cProfile ماڈیول (Python معیاری لائبریری کا حصہ بھی ہے) کا استعمال کرتے ہوئے Python اسکرپٹ کو کیسے پروفائل کیا جائے۔ 

مندرجہ ذیل Python اسکرپٹ پر غور کریں:

# main.py
import time def func(num): for i in range(num): print(i) def another_func(num): time.sleep(num) print(f"Slept for {num} seconds") def useful_func(nums, target): if target in nums: return nums.index(target) if __name__ == "__main__": func(1000) another_func(20) useful_func([2, 8, 12, 4], 12)

 

یہاں ہمارے تین افعال ہیں:

  • func() جو کہ نمبروں کی ایک رینج سے گزرتا ہے اور انہیں پرنٹ کرتا ہے۔
  • another func() جس میں کال پر مشتمل ہے۔ sleep() تقریب.
  • useful_func() جو فہرست میں ہدف نمبر کا اشاریہ لوٹاتا ہے (اگر ہدف فہرست میں موجود ہے)۔

جب بھی آپ main.py اسکرپٹ چلاتے ہیں تو اوپر درج فنکشنز کو بلایا جائے گا۔

کمانڈ لائن پر cProfile چل رہا ہے۔

استعمال کرتے ہوئے کمانڈ لائن پر cProfile چلائیں:

python3 -m file-name.py

 

یہاں ہم نے فائل کا نام main.py رکھا ہے:

python3 -m main.py

 

اسے چلانے سے آپ کو درج ذیل آؤٹ پٹ ملنا چاہیے۔

 Output >> 0 ... 999 Slept for 20 seconds

 

اور درج ذیل پروفائل:

 

ٹائمائٹ اور سی پروفائل کا استعمال کرتے ہوئے ازگر کوڈ کی پروفائلنگ
 

یہاں، ncalls فنکشن کو کالز کی تعداد سے مراد ہے اور percall فی فنکشن کال کے وقت سے مراد ہے۔ اگر کی قدر ncalls پھر ایک سے بڑا ہے۔ percall تمام کالوں کا اوسط وقت ہے۔

اسکرپٹ کے نفاذ کے وقت کا غلبہ ہے۔ another_func جو بلٹ ان استعمال کرتا ہے۔ sleep فنکشن کال (20 سیکنڈ کے لیے سوتا ہے)۔ ہم دیکھتے ہیں کہ print فنکشن کالز بھی کافی مہنگی ہیں۔ 

Python اسکرپٹ میں cProfile کا استعمال

کمانڈ لائن پر cProfile چلانے کے دوران ٹھیک کام کرتا ہے، آپ Python اسکرپٹ میں پروفائلنگ کی فعالیت بھی شامل کر سکتے ہیں۔ آپ cProfile کے ساتھ مل کر استعمال کر سکتے ہیں۔ pstats ماڈیول پروفائلنگ اور اعدادوشمار تک رسائی کے لیے۔

وسائل کے سیٹ اپ اور ٹیرڈاون کو بہتر طریقے سے ہینڈل کرنے کے لیے ایک بہترین عمل کے طور پر، بیان کے ساتھ استعمال کریں اور ایک پروفائل آبجیکٹ بنائیں جو سیاق و سباق کے مینیجر کے طور پر استعمال ہوتا ہے:

# main.py
import pstats
import time
import cProfile def func(num): for i in range(num): print(i) def another_func(num): time.sleep(num) print(f"Slept for {num} seconds") def useful_func(nums, target): if target in nums: return nums.index(target) if __name__ == "__main__": with cProfile.Profile() as profile: func(1000) another_func(20) useful_func([2, 8, 12, 4], 12) profile_result = pstats.Stats(profile) profile_result.print_stats()

 

آئیے تیار کردہ آؤٹ پٹ پروفائل پر گہری نظر ڈالیں:

 

ٹائمائٹ اور سی پروفائل کا استعمال کرتے ہوئے ازگر کوڈ کی پروفائلنگ
 

جب آپ ایک بڑے اسکرپٹ کی پروفائلنگ کر رہے ہیں، تو یہ مددگار ثابت ہوگا۔ عملدرآمد کے وقت کے مطابق نتائج کو ترتیب دیں۔. ایسا کرنے کے لیے آپ کال کر سکتے ہیں۔ sort_stats پروفائل آبجیکٹ پر اور عمل درآمد کے وقت کی بنیاد پر ترتیب دیں: 

...
if __name__ == "__main__": with cProfile.Profile() as profile: func(1000) another_func(20) useful_func([2, 8, 12, 4], 12) profile_result = pstats.Stats(profile) profile_result.sort_stats(pstats.SortKey.TIME) profile_result.print_stats()

 

جب آپ اب اسکرپٹ چلاتے ہیں، تو آپ کو وقت کے حساب سے ترتیب شدہ نتائج دیکھنے کے قابل ہونا چاہیے:

 

ٹائمائٹ اور سی پروفائل کا استعمال کرتے ہوئے ازگر کوڈ کی پروفائلنگ

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

ٹائم اسٹیمپ:

سے زیادہ KDnuggets