Python มีหลายวิธีในการวัดเวลาของการดำเนินการสำหรับโค้ดหลาม วิธีหนึ่งคือการใช้ python inbuilt time module และประหยัดเวลาก่อนและหลังการทำงานของโปรแกรม?
การจับเวลา Python
เมื่อบางโปรแกรมกำลังทำงาน กระบวนการจำนวนมากยังทำงานในพื้นหลังเพื่อทำให้โค้ดนั้นสามารถเรียกทำงานได้ โมดูลเวลาไม่นับเวลาดำเนินการในเบื้องหลังของกระบวนการ อย่างไรก็ตาม หากคุณต้องการเวลาที่แม่นยำในการวัดประสิทธิภาพ ให้โมดูลดำเนินการ
โมดูล timeit เรียกใช้โค้ดประมาณ 1 ล้านครั้ง (ค่าเริ่มต้น) และคำนึงถึงระยะเวลาขั้นต่ำที่ใช้ในการเรียกใช้โค้ดนั้น
รับเวลาดำเนินการ Python โดยใช้ timeit
เราสามารถใช้โมดูล timeit ได้หลายวิธี วิธีที่ง่ายที่สุดวิธีหนึ่งคือใช้โดยตรงบน python CLI
ตัวอย่าง
เราจะเริ่มใช้ python CLI กับโมดูล timeit ก่อน เมื่อใช้ CLI เราจะสังเกตเห็นว่าโมดูลเองกำหนดจำนวนการทำซ้ำที่เกิดขึ้นสำหรับโค้ดชิ้นเดียวกัน
ตัวอย่างที่ 1
C:\Users\rajesh>python -m timeit "'-'.join(str(n) for n in range(200))" 1000 loops, best of 3: 290 usec per loop C:\Users\rajesh>python -m timeit "'-'.join(str(n) for n in range(200))" 1000 loops, best of 3: 292 usec per loop C:\Users\rajesh>python -m timeit "'-'.join(str(n) for n in range(200))" 1000 loops, best of 3: 294 usec per loop
ตัวอย่างที่ 2
ต่อไปเราจะแนะนำ timeit ด้วยตัวอย่างง่ายๆ แต่ก่อนอื่นเราต้องนำเข้าโมดูล timeit ด้วยคำสั่ง "import timeit" นี่เป็นสิ่งจำเป็นในกรณีที่เราไม่ได้ใช้ไวยากรณ์บรรทัดคำสั่งเหมือนข้างบน
#Import timeit module import timeit # The instructions being timed. print('x' * 5) print('x' + 'x' + 'x' + 'x' + 'x') # Call timeit on the statements and print the time returned. # ... Specify optional number of iterations. print(timeit.timeit("y = 'x' * 3", number=10000000)) print(timeit.timeit("xy = 'x' + 'x' + 'x' + 'x' + 'x'", number = 10000000))
ด้านบน เราส่งคำสั่งในสตริงที่ยกมาไปยังเมธอด timeit.timeit จากนั้นเราเพิ่มการวนซ้ำโดยระบุอาร์กิวเมนต์ตัวเลข
ผลลัพธ์
ครั้งแรกที่รันโปรแกรมด้านบน สร้างเอาต์พุต:
xxxxx xxxxx 0.9041136896626635 0.7712796073957123
ครั้งที่สองในการรันโปรแกรมด้านบน สร้างเอาต์พุต:
xxxxx xxxxx 0.7317015874427751 0.7312688195585995
ครั้งที่สามในการรันโปรแกรมด้านบน, สร้างเอาต์พุต:
xxxxx xxxxx 0.7240862411172824 0.7255863890794246
เราดำเนินการโปรแกรมข้างต้นหลายครั้ง (3 ครั้ง) และเห็นว่ามีการลดลงเป็นเวลาดำเนินการ แทนที่จะทำด้วยตนเอง เรามาทำซ้ำผ่านโปรแกรมกันดีกว่า:
#Import timeit module import timeit # Call timeit on the statements and print the time returned. # ... Specify optional number of iterations. print(timeit.repeat("y = 'x' * 3", number=10000000, repeat = 5)) print() print(timeit.repeat("xy= 'x' + 'x' + 'x' + 'x' + 'x'", number = 10000000, repeat = 5))
ผลลัพธ์
[0.7303736343436382, 0.7213687552991258, 0.7362311105941466, 0.7293136666273243, 0.7278277732068212] [0.7388334197158559, 0.7378481457977326, 0.9486733868277772, 0.735295442480929, 0.7398226849056382]
เรียกใช้คำสั่งหลายคำสั่งโดยใช้โมดูล timeit:
เราสามารถใช้หลายคำสั่งกับโมดูล timeit เราแยกแต่ละประโยคโดยใช้เครื่องหมายอัฒภาค แม้ว่าจะไม่ใช่วิธีที่ดีที่สุดในการเขียนโค้ดแต่ช่วยในการระบุส่วนย่อยของโค้ดที่ยาวขึ้น
#Import timeit module import timeit # Use semicolon for multiple statements. print(timeit.repeat("x = 2; x *= 2", number=100000000)) print(timeit.repeat("x = 1; x *= 4", number=100000000))
ผลลัพธ์
[24.859605879029118, 23.58795536845994, 23.95826726353284] [22.70639977603264, 21.380195994245724, 20.71523588130414]
ใช้ Methods ตั้งค่าในโมดูล Timeit:
เราสามารถใช้เมธอดแบบกำหนดเองใน timeit โดยระบุอาร์กิวเมนต์การตั้งค่า ในอาร์กิวเมนต์นี้ เราระบุคำสั่งนำเข้าที่ระบุวิธีการที่เราเรียกใช้
#Import timeit module import timeit def func1(): return 1 def func2(): return sum([-1, 0, 1, 1]) # Test methods. print(func1()) print(func2()) # Pass setup argument to call methods. print(timeit.repeat("func1()", setup="from __main__ import func1")) print(timeit.repeat("func2()", setup="from __main__ import func2"))
ในโปรแกรมด้านบน เราเปรียบเทียบเมธอด func1() กับเมธอด func2()
ผลลัพธ์
1 1 [0.44798489246658874, 0.4411512652046069, 0.44570416580426686] [1.583622557983199, 1.5712399227517881, 1.5469479030713984]
เนื่องจาก func1() ทำงานน้อยลง ทำงานเร็วขึ้นมาก
สรุป
ด้านบน เราเห็นวิธีที่เราสามารถวัดประสิทธิภาพของโค้ด python ชิ้นเล็กๆ โดยใช้โมดูล timeit โดยใช้ CLI และสคริปต์ได้เช่นกัน