% Timeit trong python là gì?


96

Tôi luôn đọc mã để tính thời gian theo cách này:

%timeit function()

Bạn có thể giải thích "%" ở đây có nghĩa là gì?

Tôi nghĩ, "%" luôn được sử dụng để thay thế một cái gì đó trong một chuỗi, như% s có nghĩa là thay thế một chuỗi,% d thay thế một dữ liệu, nhưng tôi không biết về trường hợp này.


16
Đó là một lệnh ma thuật từ iPython. Xem: iPython Magics
MrAlexBailey

Câu trả lời:


91

%timeitlà một hàm ma thuật ipython , có thể được sử dụng để định thời gian cho một đoạn mã cụ thể (Một câu lệnh thực thi duy nhất hoặc một phương thức duy nhất).

Từ các tài liệu:

% thời gian

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

Để sử dụng nó, chẳng hạn như nếu chúng ta muốn tìm hiểu xem việc sử dụng xrangecó nhanh hơn cách sử dụng hay không range, bạn chỉ cần thực hiện:

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

Và bạn sẽ nhận được thời gian cho chúng.

Ưu điểm chính của %timeitlà:

  • mà bạn không phải nhập timeit.timeit từ thư viện chuẩn và chạy mã nhiều lần để tìm ra cách tiếp cận tốt hơn.

  • % timeit sẽ tự động tính toán số lần chạy cần thiết cho mã của bạn dựa trên tổng thời lượng thực thi là 2 giây.

  • Bạn cũng có thể sử dụng các biến bảng điều khiển hiện tại mà không cần chuyển toàn bộ đoạn mã như trong trường hợp timeit.timeittạo biến được tạo trong một môi trường khác mà thời gian hoạt động.


1
có cách nào để định thời gian cho macro hoặc một tập hợp các dòng từ ipython shell không?
alpha_989

2
@ alpha_989 Có, bạn có thể bao bọc các dòng đó trong một hàm và sau đó đặt thời gian cho hàm như:%timeit function()
mu 無

@mu 無: Vui lòng làm rõ timer.timeit- đó có phải là tên mô-đun thực tế không?
đài phun nước vào


đầu ra 10000 loops, best of 3: 29.6 µs per loopcó thể được hiểu là: (1.) biểu thức được chạy 10000 lần để có tổng thời gian (2.) sau đó tổng thời gian được chia cho 10000 để có thời gian "mỗi vòng lặp" và (3.) tổng thời gian tính toán được thực hiện 3 lần và cuối cùng (4) trong tổng số 3 lần, tổng thời gian tối thiểu (còn gọi là "tốt nhất trong 3") được sử dụng làm đầu ra. cách hiểu của tôi có đúng không, có / không?
Trevor Boyd Smith

37

Điều này được biết đến như một phép thuật dòng trong iPython. Chúng đặc biệt ở chỗ các đối số của chúng chỉ kéo dài đến cuối dòng hiện tại và bản thân các phép thuật thực sự được cấu trúc để phát triển dòng lệnh. timeitđược sử dụng để tính thời gian thực thi mã.

Nếu bạn muốn xem tất cả các phép thuật mà bạn có thể sử dụng, bạn chỉ cần nhập:

%lsmagic

để nhận danh sách cả phép thuật dòng và phép thuật ô.

Một số thông tin ma thuật khác từ tài liệu ở đây :

IPython có một hệ thống lệnh mà chúng tôi gọi là phép thuật cung cấp hiệu quả một ngôn ngữ lệnh mini trực giao với cú pháp của Python và người dùng có thể mở rộng bằng các lệnh mới. Phép thuật có nghĩa là được nhập tương tác, vì vậy chúng sử dụng các quy ước dòng lệnh, chẳng hạn như sử dụng khoảng trắng để phân tách các đối số, dấu gạch ngang cho các tùy chọn và các quy ước khác điển hình của môi trường dòng lệnh.

Tùy thuộc vào việc bạn đang ở chế độ dòng hay chế độ ô , có hai cách khác nhau để sử dụng %timeit. Câu hỏi của bạn minh họa cách đầu tiên:

In [1]: %timeit range(100)

vs.

In [1]: %%timeit 
      : x = range(100)
      :


2

Tôi chỉ muốn thêm một lợi ích hữu ích khác của việc sử dụng% timeit để trả lời bằng mu 無rằng:

  • Bạn cũng có thể sử dụng các biến bảng điều khiển hiện tại mà không cần chuyển toàn bộ đoạn mã như trong trường hợp timeit.timeit để xây dựng biến được xây dựng trong một môi trường khác mà timeit hoạt động.

Tái bút: Tôi biết đây là một bình luận để trả lời ở trên nhưng hiện tại tôi không có đủ danh tiếng cho điều đó, hy vọng những gì tôi viết sẽ hữu ích cho ai đó và giúp tôi có đủ danh tiếng để bình luận lần sau.


1
Bạn cũng có thể chỉnh sửa câu trả lời của người khác để cải thiện nó. Bạn nên đã có đủ danh tiếng cho rằng
Tarick Welling

Cảm ơn không biết điều đó. @TarickWelling
Ankit Agrawal

2

Tôi chỉ muốn thêm một điểm rất tinh tế về %% thời gian. Vì nó chạy "phép thuật" trên ô , bạn sẽ gặp lỗi ...

UseError: %%timeitKhông tìm thấy chức năng phép dòng

... nếu có bất kỳ mã / dòng bình luận nào trên %% timeit. Nói cách khác, hãy đảm bảo rằng %% timeit là lệnh đầu tiên trong ô của bạn.

Tôi biết đó là một điểm nhỏ mà tất cả các chuyên gia sẽ nói với bạn, nhưng tôi chỉ muốn thêm nửa xu của tôi cho các phù thủy trẻ bắt đầu với các trò ảo thuật.


1
Điều này không áp dụng được trong vỏ iPython, chỉ trong sổ ghi chép Jupyter
snakecharmerb

0

Phép thuật dòng có tiền tố là ký tự % và hoạt động giống như lệnh gọi dòng lệnh của hệ điều hành: chúng lấy phần còn lại của dòng dưới dạng đối số, nơi các đối số được truyền mà không có dấu ngoặc đơn hoặc dấu ngoặc kép. Phép thuật ô được bắt đầu bằng một %% kép và chúng là các hàm nhận như một đối số không chỉ phần còn lại của dòng mà còn các dòng bên dưới nó trong một đối số riêng biệt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.