Đo thời gian xử lý với mô-đun timeit của Python.

Kinh doanh

Sử dụng mô-đun thời gian của thư viện chuẩn Python, bạn có thể dễ dàng đo thời gian thực thi của một quy trình trong mã của mình. Điều này rất hữu ích để kiểm tra nhanh.

Hai trường hợp sau đây sẽ được thảo luận ở đây.

  • Đo lường trong tệp Python:timeit.timeit(),timeit.repeat()
  • Đo lường với Máy tính xách tay Jupyter:%timeit,%%timeit

Một cách khác là sử dụng time.time () để đo thời gian đã trôi qua trong chương trình.

Các phép đo trong tệp Python: timeit.timeit (), timeit.repeat ()

Ví dụ, chúng ta sẽ đo thời gian xử lý của một hàm đơn giản, test (n), tính tổng của n số liên tiếp.

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

Nếu bạn chuyển mã bạn muốn đo dưới dạng chuỗi vào hàm timeit.timeit (), nó sẽ được thực thi NUMBER lần và thời gian mà nó đã mất sẽ được trả về.
Giá trị mặc định cho số là 1.000.000. Lưu ý rằng nếu bạn sử dụng giá trị mặc định cho một quá trình mất thời gian, nó sẽ mất rất nhiều thời gian.

Bằng cách truyền các hình cầu () dưới dạng toàn cầu đối số, mã sẽ được thực thi trong không gian tên chung.
Nếu không có điều này, kiểm tra hàm và biến n không được nhận dạng trong ví dụ trên.

Mã được chỉ định có thể là một đối tượng có thể gọi thay vì một chuỗi, vì vậy nó có thể được chỉ định dưới dạng biểu thức lambda không có đối số; trong trường hợp này, toàn cầu đối số không cần phải được chỉ định.

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

Đơn vị của kết quả là giây. Ở đây, đầu ra là thời gian xử lý mỗi lần thực hiện chia cho số lần thực hiện.

Nếu bạn không chia, giá trị kết quả sẽ đơn giản trở nên lớn hơn khi bạn tăng số lần thực thi.

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

Sử dụng hàm timeit.repeat (), timeit () có thể được thực thi lặp đi lặp lại. Kết quả sẽ nhận được dưới dạng danh sách.

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

Đo lường với Máy tính xách tay Jupyter:%timeit, %%timeit

Trong Máy tính xách tay Jupyter (IPython), bạn có thể sử dụng các lệnh ma thuật sau; không cần phải nhập mô-đun thời gian.

  • %timeit
  • %%timeit

% thời gian

Trong% timeit, chỉ định mã đích được phân tách bằng khoảng trắng giống như các đối số dòng lệnh.

Theo mặc định, số và lặp lại trong timeit.timeit () được xác định tự động. Bạn cũng có thể chỉ định chúng bằng các tùy chọn -n và -r.

Kết quả được tính là giá trị trung bình và độ lệch chuẩn.

%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)

%% thời gian

Lệnh ma thuật %% timeit có thể được sử dụng để đo thời gian xử lý của toàn bộ ô.

Ví dụ: hãy chạy cùng một quy trình bằng cách sử dụng NumPy. Các tùy chọn -n và -r có thể được bỏ qua.

Vì chúng tôi đo thời gian xử lý của toàn bộ ô, ví dụ sau bao gồm thời gian nhập 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)

Không cần chỉ định mã đích làm đối số cho %% timeit. Tất cả những gì bạn phải làm là ghi %% timeit vào đầu ô, vì vậy đây là cách dễ sử dụng nhất.