วัดเวลาประมวลผลด้วยโมดูล timeit ของ Python

ธุรกิจ

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

สองกรณีต่อไปนี้จะกล่าวถึงที่นี่

  • วัดในไฟล์ Python:timeit.timeit(),timeit.repeat()
  • การวัดด้วยโน้ตบุ๊ก Jupyter:%timeit,%%timeit

อีกวิธีหนึ่งคือการใช้ time.time() เพื่อวัดเวลาที่ผ่านไปในโปรแกรม

การวัดในไฟล์ Python: timeit.timeit(), timeit.repeat()

ตัวอย่างเช่น เราจะวัดเวลาในการประมวลผลของฟังก์ชันอย่างง่าย ซึ่งก็คือ test(n) ซึ่งคำนวณผลรวมของ n ตัวเลขที่ต่อเนื่องกัน

import timeit

def test(n):
    return sum(range(n))

n = 10000
loop = 1000

result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842

หากคุณส่งรหัสที่คุณต้องการวัดเป็นสตริงไปยังฟังก์ชัน timeit.timeit() รหัสจะถูกดำเนินการ NUMBER ครั้งและเวลาที่ใช้จะถูกส่งคืน
ค่าเริ่มต้นสำหรับตัวเลขคือ 1,000,000 โปรดทราบว่าหากคุณใช้ค่าเริ่มต้นสำหรับกระบวนการที่ใช้เวลานาน จะต้องใช้เวลามาก

โดยการส่ง globals() เป็นอาร์กิวเมนต์ globals รหัสจะถูกดำเนินการในเนมสเปซส่วนกลาง
หากไม่มีสิ่งนี้ การทดสอบฟังก์ชันและตัวแปร n จะไม่เป็นที่รู้จักในตัวอย่างข้างต้น

รหัสที่จะระบุสามารถเป็นวัตถุที่เรียกได้แทนที่จะเป็นสตริง ดังนั้นจึงสามารถระบุเป็นนิพจน์แลมบ์ดาโดยไม่มีอาร์กิวเมนต์ ในกรณีนี้ ไม่จำเป็นต้องระบุอาร์กิวเมนต์ globals

result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287

หน่วยของผลลัพธ์คือวินาที ในที่นี้ ผลลัพธ์คือเวลาประมวลผลต่อการดำเนินการ หารด้วยจำนวนการดำเนินการ

ถ้าคุณไม่หาร ค่าผลลัพธ์จะเพิ่มขึ้นเมื่อคุณเพิ่มจำนวนการดำเนินการ

print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038

การใช้ฟังก์ชัน timeit.repeat() ทำให้ timeit() สามารถดำเนินการซ้ำๆ ได้ ผลลัพธ์จะได้รับเป็นรายการ

repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]

การวัดด้วยโน้ตบุ๊ก Jupyter:%timeit, %%timeit

ใน Jupyter Notebook (IPython) คุณสามารถใช้คำสั่งเวทย์มนตร์ต่อไปนี้ ไม่จำเป็นต้องนำเข้าโมดูล timeit

  • %timeit
  • %%timeit

%timeit

ใน %timeit ระบุรหัสเป้าหมายโดยคั่นด้วยช่องว่างเช่นอาร์กิวเมนต์บรรทัดคำสั่ง

โดยค่าเริ่มต้น จำนวนและทำซ้ำใน timeit.timeit() จะถูกกำหนดโดยอัตโนมัติ คุณยังสามารถระบุได้ด้วยตัวเลือก -n และ -r

ผลลัพธ์จะคำนวณเป็นค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐาน

%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

%%timeit

คำสั่งเวทย์มนตร์ %%timeit สามารถใช้วัดเวลาประมวลผลของเซลล์ทั้งหมดได้

ตัวอย่างเช่น เรียกใช้กระบวนการเดียวกันโดยใช้ NumPy อ็อพชัน -n และ -r สามารถละเว้นได้

เนื่องจากเราวัดเวลาประมวลผลของทั้งเซลล์ ตัวอย่างต่อไปนี้จึงรวมเวลาในการนำเข้า NumPy

%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)

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