วิธีใช้ timeit to profile Python code

ด้วยการออกแบบ Python ให้ความสะดวกอ่านง่ายและใช้งานง่ายเหนือกว่าประสิทธิภาพ แต่นั่นไม่ได้หมายความว่าคุณควรจัดการกับโค้ด Python ที่ช้า อาจมีบางอย่างที่คุณสามารถทำได้เพื่อเร่งความเร็ว

ในบรรดาเครื่องมือที่มีให้สำหรับการทำโปรไฟล์ประสิทธิภาพของโค้ด Python timeitโมดูลที่ง่ายที่สุดคือ timeitใช้เพื่อวัดความเร็วของโค้ดขนาดเล็กไม่กี่บรรทัดฟังก์ชัน - โดยการรันโค้ดหลายพันหรือหลายล้านครั้งและรายงานว่าการดำเนินการเหล่านั้นใช้เวลานานเท่าใด

timeitมีประโยชน์มากที่สุดสำหรับการเปรียบเทียบวิธีต่างๆสองหรือสามวิธีในการทำบางสิ่งและดูว่าวิธีใดเร็วที่สุด ตัวอย่างเช่นลูปที่ทำงานสำหรับการวนซ้ำหลายพันครั้งเป็นคอขวดของ Python ทั่วไป หากคุณสามารถหาวิธีเพิ่มความเร็วในการใช้งานลูปนั้นได้เช่นโดยใช้ Python ในตัวแทนโค้ดที่เขียนด้วยลายมือคุณจะได้รับการปรับปรุงประสิทธิภาพที่วัดได้

ตัวอย่างง่ายๆของ Python timeit

นี่คือตัวอย่างง่ายๆของวิธีการtimeitทำงาน:

def f1 (): สำหรับ n ในช่วง (100): ส่งผ่าน def f2 (): n = 0 ในขณะที่ n <100: n + = 1 ถ้า __name__ == "__main__": พิมพ์เวลานำเข้า (timeit.timeit (f1, number = 100000)) พิมพ์ (timeit.timeit (f2, number = 100000)) 

โปรแกรมนี้เปรียบเทียบประสิทธิภาพของสองวิธีในการวนซ้ำ 100 ครั้ง: โดยใช้range ฟังก์ชันในตัวของ Python  ( f1) และโดยการเพิ่มตัวแปร ( f2timeit รันแต่ละวิธีเหล่านี้ 100,000 ครั้งและจัดเตรียมรันไทม์ทั้งหมดในตอนท้ายสำหรับแต่ละวิธี ตามค่าเริ่มต้น  timeit ใช้หนึ่งล้านรัน แต่ตัวอย่างนี้แสดงให้เห็นว่าคุณสามารถกำหนดจำนวนการรันให้เป็นตัวเลขใดก็ได้ที่เหมาะสม

ผลลัพธ์ (จากโปรเซสเซอร์ Intel i7-3770K):

0.1252315

0.45453989999999994

เห็นได้ชัดว่า  range แนวทางนั้นเร็วกว่ามากโดยมีค่าประมาณ 3.75 นี่ไม่น่าแปลกใจเลย โดยทั่วไปแล้วการใช้ Python ในตัวจะให้ประสิทธิภาพที่ดีกว่าการจัดการกับวัตถุ Python ด้วยตนเอง

ใช้ Python timeit โดยส่งสตริง

อีกวิธีในการใช้  timeit คือส่งสตริงที่ประเมินเป็นโปรแกรม Python:

เวลานำเข้า

พิมพ์ (timeit.timeit ('สำหรับ n ในช่วง (100): pass'))

สิ่งนี้สามารถทำได้จากบรรทัดคำสั่ง:

python -m timeit "สำหรับ n ในช่วง (100): pass"

โดยรวมแล้วการใช้เทคนิคที่แสดงด้านบนนั้นง่ายกว่าเนื่องจากคุณไม่จำเป็นต้องขัดรองเท้ารหัสของคุณลงในสตริงข้อความ

เคล็ดลับ Python timeit

มีประโยชน์เช่นเดียวกับที่  timeit เป็นอยู่โปรดระลึกถึงคำเตือนเหล่านี้เกี่ยวกับวิธีการใช้งาน

หลีกเลี่ยงการใช้ timeit สำหรับการทำโปรไฟล์ทั้งโปรแกรม

กล่าวว่าไม่มีอะไรที่คุณ  ไม่สามารถtimeitช่วงเวลาที่โปรแกรมทั้งหมดที่มี ตัวอย่างเช่นสคริปต์ 10 บรรทัดธรรมดาไม่ใช่ตัวเลือกที่ไม่ดีสำหรับการทำโปรไฟล์ด้วยวิธีนี้

แต่มีเครื่องมือที่ดีกว่าสำหรับงานนั้นตัวอย่างเช่นcProfile โมดูลของ Python  ซึ่งสร้างสถิติที่ละเอียดกว่าเกี่ยวกับประสิทธิภาพของโปรแกรมทั้งหมดของคุณ timeit ทำงานได้ดีที่สุดกับองค์ประกอบเดียวหรือข้อมูลโค้ด - อีกครั้งฟังก์ชันหรือโค้ดสองสามบรรทัด อะไรที่มากกว่านั้นมักจะสร้างผลลัพธ์ที่มีเสียงดังเกินไปและไม่สอดคล้องกันเพื่อให้ข้อมูลประสิทธิภาพที่มีความหมายแก่คุณ

นอกจากนี้หากโปรแกรมที่คุณกำลังทำโปรไฟล์ใช้เวลาหลายนาทีในการดำเนินการ  timeit จะไม่มีประโยชน์มากนัก สำหรับหนึ่งรหัสจะใช้เวลานานเกินไปในการรันโค้ดมากกว่าสองสามครั้งดังนั้นการกำหนดเวลาที่รวบรวมไว้จะหยาบมาก สำหรับสองเครื่องมืออื่น ๆ จะเหมาะกับงานมากกว่า

ดำเนินการหลายเวลามันทำงานบนเครื่องต่างๆ

โปรแกรมไม่ทำงานด้วยความเร็วเท่ากันทุกครั้ง สภาพแวดล้อมการประมวลผลสมัยใหม่ทำให้เกิดความไม่แน่นอนอย่างมาก - การแข่งขันกับโปรแกรมอื่นสำหรับทรัพยากรพฤติกรรมแคชการตั้งเวลาและอื่น ๆ timeit พยายามชดเชยสิ่งนี้ด้วยการเรียกใช้โค้ดโฆษณา infinitum แต่ก็ยังเป็นความคิดที่ดีที่จะรวมการทดลองหลายรายการ คุณควรเรียกใช้  timeit โปรไฟล์หลาย ๆ ครั้งทิ้งคะแนนที่แย่ที่สุดและดีที่สุดและเฉลี่ยส่วนที่เหลือ

สุดท้ายนี้ยังช่วยในการทดสอบแบบเดียวกันในระบบต่างๆ: บางสิ่งบางอย่างที่เชื่อมต่อกับดิสก์จะทำงานอย่างไรบน SSD เมื่อเทียบกับฮาร์ดไดรฟ์แบบหมุนทั่วไป เช่นเดียวกับคำถามอื่น ๆ เกี่ยวกับประสิทธิภาพอย่าเดาทดสอบ