วิธีใช้ 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
) และโดยการเพิ่มตัวแปร ( f2
) timeit
รันแต่ละวิธีเหล่านี้ 100,000 ครั้งและจัดเตรียมรันไทม์ทั้งหมดในตอนท้ายสำหรับแต่ละวิธี ตามค่าเริ่มต้น timeit
ใช้หนึ่งล้านรัน แต่ตัวอย่างนี้แสดงให้เห็นว่าคุณสามารถกำหนดจำนวนการรันให้เป็นตัวเลขใดก็ได้ที่เหมาะสม
ผลลัพธ์ (จากโปรเซสเซอร์ Intel i7-3770K):
0.12523150.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 เมื่อเทียบกับฮาร์ดไดรฟ์แบบหมุนทั่วไป เช่นเดียวกับคำถามอื่น ๆ เกี่ยวกับประสิทธิภาพอย่าเดาทดสอบ