آموزش بنچ مارکینگ و پروفایل در همزمانی پایتون

3 سال پیش
آموزش بنچ مارکینگ و پروفایل در همزمانی پایتون

آموزش بنچ مارکینگ و پروفایل در همزمانی پایتون

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

پیشنهاد ویژه : پکیج آموزش پروژه محور پایتون

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

بنچ مارکینگ چیست؟

هدف گذاری بنچ مارکینگ ارزیابی چیزی یا مقایسه با استاندارد است. با این حال ، سوالی که در اینجا مطرح می شود این است که معیار تعیین کننده چیست و چرا در صورت برنامه نویسی نرم افزار به آن نیاز داریم. بنچ مارکینگ کد به معنای سرعت اجرای کد است. یک دلیل عمده برای بنچ مارکینگ بهینه سازی کد است.

بنچ مارکینگ چگونه کار می کند؟

اگر ما در مورد کار معیار زدن صحبت می کنیم ، باید با محک زدن کل برنامه به عنوان یک حالت فعلی شروع کنیم و سپس می توانیم معیارهای خرد را ترکیب کنیم و سپس یک برنامه را به برنامه های کوچکتر تجزیه کنیم. به منظور یافتن گلوگاه های موجود در برنامه ما و بهینه سازی آن. به عبارت دیگر ، ما می توانیم آن را به عنوان شکستن مشکل بزرگ و سخت به مجموعه ای از مشکلات کوچکتر و کمی آسان تر برای بهینه سازی آنها درک کنیم.

ماژول پایتون برای بنچ مارکینگ

در پایتون، ماژولی به طور پیش فرض برای بنچ مارکینگ داریم که timeit نامیده می شود. با کمک ماژول timeit می توانیم تابع کمی از کد پایتون را در برنامه اصلی خود بسنجیم.

مثال

در اسکریپت پایتون زیر ، ما در حال وارد کردن ماژول timeit هستیم، که مدت زمان بیشتری را برای اجرای دو تابع اندازه می گیرد – functionA و functionB –
import timeit
import time
def functionA():
   print("Function A starts the execution:")
   print("Function A completes the execution:")
def functionB():
   print("Function B starts the execution")
   print("Function B completes the execution")
start_time = timeit.default_timer()
functionA()
print(timeit.default_timer() - start_time)
start_time = timeit.default_timer()
functionB()
print(timeit.default_timer() - start_time)
پس از اجرای اسکریپت فوق، زمان اجرای هر دو تابع را همانطور که در زیر نشان داده شده است ، بدست خواهیم آورد.

خروجی

Function A starts the execution:
Function A completes the execution:
۰٫۰۰۱۴۵۹۹۴۹۵۵۱۴۱۷۵۹۴۲
Function B starts the execution
Function B completes the execution
۰٫۰۰۱۷۰۲۴۷۲۴۸۲۷۴۷۹۰۷۶

 

نوشتن تایمر با استفاده از تابع دکوراتور

در پایتون می توانیم تایمر خود را ایجاد کنیم که دقیقاً مانند ماژول timeit عمل خواهد کرد. می توان آن را با کمک تابع دکوراتور انجام داد. در زیر مثالی از تایمر سفارشی آورده شده است
import random
import time

def timer_func(func):

   def function_timer(*args, **kwargs):
   start = time.time()
   value = func(*args, **kwargs)
   end = time.time()
   runtime = end - start
   msg = "{func} took {time} seconds to complete its execution."
      print(msg.format(func = func.__name__,time = runtime))
   return value
   return function_timer

@timer_func
def Myfunction():
   for x in range(5):
   sleep_time = random.choice(range(1,3))
   time.sleep(sleep_time)

if __name__ == '__main__':
   Myfunction()

 

اسکریپت پایتون فوق در وارد کردن ماژول های زمان تصادفی کمک می کند. ما عملکرد دکوراتور () timer_func را ایجاد کرده ایم. این تابع () function_timer را درون خود دارد. اکنون، تابع تو در تو زمان قبل از فراخوانی تابع عبور را می گیرد. سپس منتظر می ماند تا تابع برگردد و زمان پایان را می گیرد. به این ترتیب، در نهایت می توانیم اسکریپت پایتون را وادار به چاپ زمان اجرا کنیم. اسکریپت همانطور که در زیر نشان داده شده است ، خروجی ایجاد می کند.

خروجی

Myfunction took 8.000457763671875 seconds to complete its execution.

 

پروفایل چیست؟

گاهی اوقات برنامه نویس می خواهد برخی ویژگی ها مانند استفاده از حافظه، پیچیدگی زمان یا استفاده از دستورالعمل های خاص در مورد برنامه ها را اندازه گیری کند تا قابلیت واقعی آن برنامه را اندازه گیری کند. چنین نوعی اندازه گیری در مورد برنامه، پروفایل نامیده می شود. پروفایل از تجزیه و تحلیل برنامه پویا برای انجام چنین اندازه گیری استفاده می کند.

cProfile – ماژول داخلی

cProfile ماژول داخلی پایتون برای پروفایل است. این ماژول یک پسوند C با سربار مناسب است که آن را برای پروفایل برنامه های طولانی مدت مناسب می کند. پس از اجرای آن، همه توابع و زمان اجرا را ثبت می کند. بسیار قدرتمند است اما گاهی اوقات تفسیر و عمل به آن کمی دشوار است. در مثال زیر، ما از cProfile روی کد زیر استفاده می کنیم –

مثال

def increment_global():

   global x
   x += 1

def taskofThread(lock):

   for _ in range(50000):
   lock.acquire()
   increment_global()
   lock.release()

def main():
   global x
   x = 0

   lock = threading.Lock()

   t1 = threading.Thread(target=taskofThread, args=(lock,))
   t2 = threading.Thread(target= taskofThread, args=(lock,))

   t1.start()
   t2.start()

   t1.join()
   t2.join()

if __name__ == "__main__":
   for i in range(5):
      main()
   print("x = {1} after Iteration {0}".format(i,x))

 

کد فوق در فایل thread_increment.py ذخیره می شود. اکنون کد را با cProfile در خط فرمان به صورت زیر اجرا کنید

 

(base) D:\ProgramData>python -m cProfile thread_increment.py
x = 100000 after Iteration 0
x = 100000 after Iteration 1
x = 100000 after Iteration 2
x = 100000 after Iteration 3
x = 100000 after Iteration 4
      ۳۵۷۷ function calls (3522 primitive calls) in 1.688 seconds

   Ordered by: standard name

   ncalls tottime percall cumtime percall filename:lineno(function)

   ۵ ۰٫۰۰۰ ۰٫۰۰۰ ۰٫۰۰۰ ۰٫۰۰۰ <frozen importlib._bootstrap>:103(release)
   ۵ ۰٫۰۰۰ ۰٫۰۰۰ ۰٫۰۰۰ ۰٫۰۰۰ <frozen importlib._bootstrap>:143(__init__)
   ۵ ۰٫۰۰۰ ۰٫۰۰۰ ۰٫۰۰۰ ۰٫۰۰۰ <frozen importlib._bootstrap>:147(__enter__)
   … … … …

 

از خروجی فوق، مشخص است که cProfile تمام ۳۵۷۷ تابع فراخوانی شده را با زمان صرف شده در هر و تعداد دفعات فراخوانی چاپ می کند. دنباله ها ستونی هستند که ما در خروجی داریم –
  • ncalls – تعداد فراخوانی ها را مشخص می کند
  • tottime – کل زمان صرف شده در تابع داده شده است.
  • percall – به ضریب tottime تقسیم بر ncalls اشاره دارد.
  • cumtime – زمان تجمعی است که در این زیر مجموعه و همه زیرمجموعه ها صرف می شود. حتی برای توابع بازگشتی نیز دقیق است.
  • percall – این ضریب زمان کومیت است که با فراخوانی ها تقسیم می شود.
  • (filename:lineno(function – اساساً داده های مربوط به هر تابع را فراهم می کند.

 

منبع.

لیست جلسات قبل آموزش همزبانی در پایتون

  1. آموزش همزمانی در برنامه نویسی پایتون
  2. آموزش همزمانی در برنامه نویسی پایتون _ مقدمه
  3. آموزش معماری سیستم و حافظه در برنامه نویسی پایتون
  4.  آموزش رشته ها در همزمانی پایتون 
  5. آموزش پیاده سازی رشته در همزمانی پایتون
  6. آموزش همگام سازی رشته ها در همزمانی پایتون
  7. آموزش ارتباط رشته ها در همزمانی پایتون
  8. آموزش تست برنامه های رشته در همزمانی پایتون
  9. اشکال زدایی از برنامه های رشته در همزمانی پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه