วันนี้ผมเอาหลายเสี้ยววินาที (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 นั่นเอง
ผมยังไม่เคยฝึกทำ 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 ขาดลอยหลายช่วงตัว
ตอนนี้ทำอะไรไม่ได้ ได้แต่มองตาปริบๆ ครับ