1 เมษายน 2558

Published 4/01/2558 by with 0 comment

รายงานประสิทธิภาพโค้ดโปรแกรมภาษา Python ด้วย profile , cProfile

สวัสดีครับทุกท่าน ในการเขียนโปรแกรม เมื่อเราเขียนโปรแกรมาโปรแกรมหนึ่ง เราต้องมีการทดสอบโปรแกรมเพื่อแก้ไข ปรับปรุง จึงต้องมีการวัดประสิทธิภาพโปรแกรม เพื่อนำไปแก้ไขปรับปรุงให้โปรแกรมทำงานได้อย่างรวดเร็วขึ้น บทความนี้จะพาผู้อ่านไปทำรายงานประสิทธิภาพโค้ดโปรแกรมภาษา Python ด้วย profile , cProfile กันครับ

profile กับ cProfile ไลบรารีสำหรับรายงานประสิทธิภาพโค้ดโปรแกรมภาษา Python ซึ่งไลบรารีนี้เป็นไลบรารีพื้นฐานของภาษา Python
ในการใช้งานไลบรารีนี้สามารถทำได้สองวิธีคือ

  1. รัน cProfile ผ่านคอมมาไลน์

  2. เรียกใช้ไลบรารี profile


วิธีที่ 1 รันผ่านคอมมาไลน์

สำหรับ Python 2
python -m CProfile ไฟล์งาน.py

สำหรับ Python 3
python -m Profile ไฟล์งาน.py

สำหรับผู้ใช้บน Ubuntu/Debian สามารถติดตั้ง Profile ได้โดยใช้คำสั่ง
sudo apt-get install python-profiler #Python 2
sudo apt-get install python-profiler #python 3

แต่ดูยากใช่ไหมครับ มีวิธีการรายงานผลการทดสอบประสิทธิภาพโค้ดโปรแกรมภาษา Python ได้โดยใช้โมดูลที่ชื่อว่า cprofilev ครับ
สามารถติดตั้งได้โดยใช้คำสั่ง pip :
pip install cprofilev

สำหรับผู้ใช้งาน Ubuntu/Debian สามารถใช้คำสั่งติดตั้งโมดูลนี้ได้โดยใช้คำสั่ง
$ sudo pip install cprofilev

การรายงานผลลัพธ์ใช้คำสั่ง
cprofilev ไฟล์งาน.py

เมื่อสั่งแล้วให้เข้าไปที่ http://localhost:4000 จะพบกับหน้ารายงานผลการทดสอบประสิทธิภาพโค้ด Python ออกมาในรูปแบบหน้าเว็บ

วิธีที่ 2 เรียกใช้ไลบรารี profile
ในโค้ด Python สามารถเรียกใช้ profile รายงานประสิทธิภาพ โดยตามตัวอย่างต่อไปนี้ครับ

[python]
>>> import profile
>>> def o():
print("Hi"*5)

>>> profile.run('o()') #เรียกใช้ฟังก์ขั่นหรือคำสั่งเพื่อทำการรายงานประสิทธิภาพของโค้ดโปรแกรม Python
HiHiHiHiHi
98 function calls in 0.016 seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)
2 0.000 0.000 0.000 0.000 :0(_acquire_restore)
2 0.000 0.000 0.000 0.000 :0(_is_owned)
2 0.000 0.000 0.000 0.000 :0(_release_save)
6 0.000 0.000 0.000 0.000 :0(acquire)
2 0.000 0.000 0.000 0.000 :0(allocate_lock)
2 0.000 0.000 0.000 0.000 :0(append)
2 0.000 0.000 0.000 0.000 :0(dumps)
1 0.000 0.000 0.016 0.016 :0(exec)
2 0.000 0.000 0.000 0.000 :0(get)
4 0.000 0.000 0.000 0.000 :0(get_ident)
4 0.000 0.000 0.000 0.000 :0(isinstance)
6 0.000 0.000 0.000 0.000 :0(len)
2 0.000 0.000 0.000 0.000 :0(pack)
1 0.000 0.000 0.016 0.016 :0(print)
2 0.000 0.000 0.000 0.000 :0(release)
2 0.000 0.000 0.000 0.000 :0(select)
2 0.000 0.000 0.000 0.000 :0(send)
1 0.000 0.000 0.000 0.000 :0(setprofile)
1 0.000 0.000 0.016 0.016 <pyshell#3>:1(o)
1 0.000 0.000 0.016 0.016 <string>:1(<module>)
2 0.000 0.000 0.016 0.008 PyShell.py:1344(write)
1 0.000 0.000 0.016 0.016 profile:0(o())
0 0.000 0.000 profile:0(profiler)
14 0.000 0.000 0.000 0.000 rpc.py:150(debug)
2 0.000 0.000 0.016 0.008 rpc.py:213(remotecall)
2 0.000 0.000 0.000 0.000 rpc.py:223(asynccall)
2 0.000 0.000 0.016 0.008 rpc.py:243(asyncreturn)
2 0.000 0.000 0.000 0.000 rpc.py:249(decoderesponse)
2 0.000 0.000 0.016 0.008 rpc.py:287(getresponse)
2 0.000 0.000 0.000 0.000 rpc.py:295(_proxify)
2 0.000 0.000 0.016 0.008 rpc.py:303(_getresponse)
2 0.000 0.000 0.000 0.000 rpc.py:325(newseq)
2 0.000 0.000 0.000 0.000 rpc.py:329(putmessage)
2 0.000 0.000 0.000 0.000 rpc.py:554(__getattr__)
2 0.000 0.000 0.000 0.000 rpc.py:595(__init__)
2 0.000 0.000 0.016 0.008 rpc.py:600(__call__)
4 0.000 0.000 0.000 0.000 threading.py:1231(current_thread)
2 0.000 0.000 0.000 0.000 threading.py:210(__init__)
2 0.016 0.008 0.016 0.008 threading.py:258(wait)
2 0.000 0.000 0.000 0.000 threading.py:75(RLock)

[/python]

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)