เสี้ยววินาทีก็มีค่า


วันนี้ผมเอาหลายเสี้ยววินาที (milliseconds) ออกจากเวลาที่ MemeExpress ใช้ในการประมวลผลครับ

ก่อนหน้านี้ผมกล่าวถึง Code Optimization ว่าเป็นงานที่อาศัยทักษะที่ต้องฝึกฝนกันตลอดชีวิต เหมือนการวาดรูปหรือการเล่นดนตรี และนี่คือสาเหตุที่ผมเห็นว่าการพัฒนาโปรแกรมจะถือได้ว่าเป็นงานศิลปะประเภทหนึ่งได้ แต่อย่าเชื่อผมครับ ถ้าคุณอยากรู้แน่นอนว่าได้หรือไม่ได้จริงๆ ผมแนะนำให้ไปอ่าน The Art of Computer Programming โดย Prof. Donald E. Knuth อ่านครบทั้งสามเล่มคุณน่าจะได้คำตอบ แต่ถ้าไม่ได้คำตอบก็ได้หลับครับ เพราะมันหนาอ่านแล้วหลับสบาย

กลับมาเรื่อง Code Optimization ต่อ ว่าแล้ววันนี้ผมก็ฝึกปรือกำลังภายในว่าด้วยการ optimize code ต่อโดยการเอาสักหลายเสี้ยววินาทีออกจาก MemeExpress เพื่อให้ทำงานเร็วขึ้นหน่อย แต่การจะไปค้นหาจุดที่ใช้เวลาประมวลผลมากด้วยมือ (manually) นั้น มันก็เสียเวลาเหลือเกิน อย่ากระนั้นเลยใช้เครื่องมือช่วยดีกว่า

สำหรับโปรแกรมที่เขียนด้วย Python แล้ว เครื่องมือในการวิเคราะห์การทำงานของ code ก็ไม่ต้องไปหาที่ไหนไกล เพราะมันมาพร้อมกับ Python Distribution อยู่แล้ว เครื่องมือนั้นได้แก่ Python Profiler

วิธีการใช้งาน Python Profiler ก็ไม่ยากเย็น เริ่มจากคุณ

import profiler

แล้วใช้

profile.run('yourcode()')

เพียงแค่นี้ Python Profiler ก็จะแสดงสถิติของการทำงานของ code ของคุณมาให้ดู ถ้าคุณอยากดูมากกว่านี้ต้องใช้

profile.run('yourcode()', '/tmp/yourstatfile')

เพื่อเก็บ profile data ไปที่ /tmp/yourstatfile แล้ว

import pstats
statobj = pstats.Stats('/tmp/yourstatfile')

คราวนี้คุณก็ได้ statobj ที่สามารถปรับแต่งให้แสดงผลการทำงานของ code คุณในรูปแบบต่างๆ ได้แล้ว สมมติว่าจะให้แสดง 10% ของ code ที่ใช้เวลาทำงานเยอะที่สุดก็

statobj.sort_stats('time')
statobj.print_stats(.1)

เท่านี้เราก็สามารถหาเป้าหมายของ code ที่ทำงานช้าและเราต้องไป optimize ได้แล้วครับ ถ้าคุณอยากรู้เพิ่มเติ่มเกี่ยวกับ Python Profiler ก็ไม่ต้องหาที่ไหนไกลเริ่มต้นได้ที่ Python Library Reference บทที่ 10 ว่าด้วย The Python Profiler นั่นเอง

คำสำคัญ (Tags): #python
หมายเลขบันทึก: 549เขียนเมื่อ 28 มิถุนายน 2005 18:42 น. ()แก้ไขเมื่อ 11 กุมภาพันธ์ 2012 13:52 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (2)

ผมยังไม่เคยฝึกทำ code optimization อย่างจริงๆ จังๆ เลย
python profiler นับเป็น skill อันหนึ่งที่อยากฝึกต่อไปในอนาคต
ถ้าติดขัดอะไรจะขอปรึกษานะครับ

ที่เคยหัดใช้ ก็มีแต่ module timeit ที่ใช้ง่ายกว่า แต่ไม่เก่งเท่า profiler
รายละเอียดดูได้ที่นี่ครับ
http://diveintopython.org/performance_tuning/timeit.html

พยายาม optimize MemeExpress แต่ไม่ว่าจะ optimize อย่างไรก็เห็น execute ของ APSW (Another Python SQLite Wrapper) ขึ้นมาเป็นอันดับหนึ่งทิ้งห่างทุกๆ function ขาดลอยหลายช่วงตัว

ตอนนี้ทำอะไรไม่ได้ ได้แต่มองตาปริบๆ ครับ

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท