Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Module timeit trong Python với ví dụ?


Python cung cấp nhiều cách đo thời gian thực thi cho một đoạn code. Một cách là dùng module time tích hợp sẵn và lưu thời gian trước và sau khi chạy chương trình?

Module timeit trong Python

Khi chương trình chạy, nhiều tiến trình nền cũng chạy để làm cho code có thể thực thi. Module time không tính thời gian thực thi của các tiến trình nền, tuy nhiên nếu bạn cần đo lường hiệu năng chính xác thì timeit là module cần dùng.

Module timeit chạy code khoảng 1 triệu lần (giá trị mặc định) và lấy thời gian tối thiểu mà đoạn code đó mất để chạy.

Lấy thời gian thực thi Python bằng timeit

Chúng ta có thể dùng module timeit theo nhiều cách. Một cách đơn giản nhất là dùng trực tiếp trên CLI Python.

Ví dụ

Chúng ta sẽ bắt đầu dùng Python CLI với module timeit. Khi dùng CLI, module tự quyết định số lần lặp cho cùng một đoạn code.

Ví dụ 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

Ví dụ 2

Tiếp theo, giới thiệu timeit với ví dụ đơn giản khác nhưng trước tiên phải import module timeit bằng câu lệnh "import timeit". Điều này cần thiết nếu không dùng cú pháp dòng lệnh như trên.

# Import module timeit import timeit # Các câu lệnh được đo thời gian. print('x' * 5) print('x' + 'x' + 'x' + 'x' + 'x') # Gọi timeit trên các câu lệnh và in thời gian trả về. # ... Chỉ định số lần lặp tùy chọn. print(timeit.timeit("y = 'x' * 3", number=10000000)) print(timeit.timeit("xy = 'x' + 'x' + 'x' + 'x' + 'x'", number = 10000000))

Ở trên, ta truyền các câu lệnh trong chuỗi có dấu ngoặc cho phương thức timeit.timeit và tăng số lần lặp bằng tham số number.

Kết quả

Lần đầu chạy chương trình trên, kết quả:

xxxxx xxxxx 0.9041136896626635 0.7712796073957123

Lần thứ hai chạy chương trình trên, kết quả:

xxxxx xxxxx 0.7317015874427751 0.7312688195585995

Lần thứ ba chạy chương trình trên, kết quả:

xxxxx xxxxx 0.7240862411172824 0.7255863890794246

Chạy chương trình nhiều lần (3 lần) thấy thời gian thực thi giảm. Thay vì làm thủ công, hãy để chương trình lặp:

# Import module timeit import timeit # Gọi timeit trên các câu lệnh và in thời gian trả về. # ... Chỉ định số lần lặp tùy chọn. print(timeit.repeat("y = 'x' * 3", number=10000000, repeat = 5)) print() print(timeit.repeat("xy= 'x' + 'x' + 'x' + 'x' + 'x'", number = 10000000, repeat = 5))

Kết quả

[0.7303736343436382, 0.7213687552991258, 0.7362311105941466, 0.7293136666273243, 0.7278277732068212] [0.7388334197158559, 0.7378481457977326, 0.9486733868277772, 0.735295442480929, 0.7398226849056382]

Chạy nhiều câu lệnh với module timeit:

Ta có thể dùng nhiều câu lệnh với timeit, phân cách nhau bằng dấu chấm phẩy. Dù không phải cách viết code tốt nhất nhưng giúp chỉ định các đoạn code dài hơn.

# Import module timeit import timeit # Dùng dấu chấm phẩy cho nhiều câu lệnh. print(timeit.repeat("x = 2; x *= 2", number=100000000)) print(timeit.repeat("x = 1; x *= 4", number=100000000))

Kết quả

[24.859605879029118, 23.58795536845994, 23.95826726353284] [22.70639977603264, 21.380195994245724, 20.71523588130414]

Dùng phương thức (methods) và setup trong module timeit:

Ta có thể dùng phương thức tùy chỉnh trong timeit bằng cách chỉ định tham số setup. Trong tham số này, ta chỉ định câu lệnh import cho biết các phương thức được gọi.

# Import module timeit import timeit def func1():    return 1 def func2():    return sum([-1, 0, 1, 1]) # Test methods. print(func1()) print(func2()) # Truyền tham số setup để gọi methods. print(timeit.repeat("func1()", setup="from __main__ import func1")) print(timeit.repeat("func2()", setup="from __main__ import func2"))

Trong chương trình trên, ta so sánh hiệu năng func1() với func2().

Kết quả

1 1 [0.44798489246658874, 0.4411512652046069, 0.44570416580426686] [1.583622557983199, 1.5712399227517881, 1.5469479030713984]

Vì func1() làm ít việc hơn, nên thực thi nhanh hơn nhiều.

Tóm tắt

Trên đây ta đã thấy cách đo hiệu năng của đoạn code Python nhỏ bằng module timeit dùng cả CLI và script.