Hai mốc thời gian bao quanh công việc
`perf_counter()` cho một giá trị đồng hồ có độ phân giải cao; lấy mốc sau trừ mốc trước để được **khoảng thời gian đã trôi qua**, tính bằng giây. Giá trị mốc riêng lẻ không phải “số giây CPU chạy” hay giờ hiện tại. Đặt hai lệnh đo sát quanh đoạn cần đo:
```python
from time import perf_counter
def tong_chan(a):
tong = 0
for x in a:
if x % 2 == 0:
tong += x
return tong
a = [2, 5, 8, 11]
bat_dau = perf_counter()
ket_qua = tong_chan(a)
ket_thuc = perf_counter()
print(ket_qua, ket_thuc - bat_dau)
```
Kết quả tổng là `10`; số giây phụ thuộc máy và lần chạy nên không ấn định một đáp số cố định.
Một dãy nhỏ không nói hết thuật toán
Với đầu vào rất nhỏ, thời gian đo có thể quá ngắn và dao động vì hệ điều hành, chương trình khác, phiên bản Python hoặc tình trạng máy. Khi so sánh hai cách giải, hãy dùng cùng máy, cùng dữ liệu tương ứng, lặp nhiều lần và xem xu hướng khi kích thước đầu vào tăng. Đo thực nghiệm giúp quan sát; để phân tích cách thời gian tăng theo `n`, cần đếm/ước lượng thao tác, được học ở bài tiếp theo. Không kết luận một thuật toán luôn nhanh hơn chỉ từ một lượt đo trên dãy mười số.
Bài luyện
Để đo khoảng thời gian chạy của hàm `f()`, biểu thức nào phù hợp?
Thứ tự này thường cho số âm.
Hiệu hai mốc cho thời gian đã trôi qua.
Tổng hai mốc không phải khoảng thời gian.
Một mốc chưa cho khoảng thời gian.
Lời giải
Ghi bat_dau, chạy f(), ghi ket_thuc rồi lấy ket_thuc − bat_dau.
Bài luyện
Đo cùng một hàm trên cùng dãy hai lần được hai số giây khác nhau rất nhỏ. Cách hiểu nào đúng?
Lỗi cú pháp sẽ ngăn chương trình chạy.
Môi trường thực thi có thể làm thời gian đo dao động.
Đầu ra và thời gian là hai chuyện khác nhau.
Đây là đồng hồ để đo khoảng thời gian, không phải giờ hiển thị.
Lời giải
Một lần đo rất ngắn có thể dao động; lặp nhiều lần và dùng cùng điều kiện khi so sánh.
Bài luyện
Trong ví dụ `tong_chan([2, 5, 8, 11])`, kết quả tổng nào có thể dự đoán chắc chắn?
2 + 8 = 10.
26 là tổng cả bốn số.
4 là số phần tử.
Tổng số chẵn không phụ thuộc thời gian đo.
Lời giải
Hai số chẵn là 2 và 8, nên hàm trả 10; thời gian chạy không cố định.
Đang học