Cách đơn giản để đo thời gian thực hiện tế bào trong máy tính xách tay ipython


182

Tôi muốn có được thời gian dành cho việc thực hiện ô ngoài đầu ra ban đầu từ ô.

Cuối cùng, tôi đã thử %%timeit -r1 -n1nhưng nó không phơi bày biến được định nghĩa trong ô.

%%time hoạt động cho ô chỉ chứa 1 câu lệnh.

In[1]: %%time
       1
CPU times: user 4 µs, sys: 0 ns, total: 4 µs
Wall time: 5.96 µs
Out[1]: 1

In[2]: %%time
       # Notice there is no out result in this case.
       x = 1
       x
CPU times: user 3 µs, sys: 0 ns, total: 3 µs
Wall time: 5.96 µs

Cách tốt nhất để làm điều đó là gì?

Cập nhật

Tôi đã sử dụng Execute Time trong Nbextension từ khá lâu rồi. Nó thật tuyệt.


3
Bạn có thực sự cần thời gian hiển thị giá trị? Tại sao không chỉ đặt xdòng hiển thị trong ô tiếp theo?
dbliss

Tại sao không chấp nhận một câu trả lời?
raratiru

Câu trả lời:


46

Sử dụng phép thuật tế bào và dự án này trên github của Phillip Cloud:

Tải nó bằng cách đặt nó ở đầu sổ ghi chép của bạn hoặc đặt nó vào tệp cấu hình của bạn nếu bạn luôn muốn tải nó theo mặc định:

%install_ext https://raw.github.com/cpcloud/ipython-autotime/master/autotime.py
%load_ext autotime

Nếu được tải, mọi đầu ra của lần thực hiện ô tiếp theo sẽ bao gồm thời gian tính bằng phút và giây để thực hiện nó.


15
cái này không còn hoạt động nữa, vì% install_ext không được dùng nữa. Có một sự thay thế?
eyeApps LLC

13
Có một Yêu cầu Kéo giải quyết vấn đề này ( github.com/cpcloud/ipython-autotime/pull/5 ) sau đó bạn có thể thửpip install ipython-autotime
x0s

13
Bây giờ %%timehoạt động ngay cả khi tuyên bố cuối cùng là không print.
rinois0dy

443

Cách duy nhất tôi tìm thấy để khắc phục vấn đề này là thực hiện câu lệnh cuối cùng bằng bản in.

Đừng quên rằng ma thuật di động bắt đầu bằng %%và ma thuật đường bắt đầu bằng %.

%%time
clf = tree.DecisionTreeRegressor().fit(X_train, y_train)
res = clf.predict(X_test)
print(res)

Lưu ý rằng bất kỳ thay đổi nào được thực hiện bên trong ô không được xem xét trong các ô tiếp theo, một cái gì đó phản tác dụng trực quan khi có một đường ống dẫn: một ví dụ


5
Bây giờ %% thời gian hoạt động ngay cả khi câu lệnh cuối cùng không được in, như @ rinois0dy đã chỉ ra ở trên.
nealmcb

1
display (res) cũng hoạt động và là giải pháp ưa thích khi cố gắng hiển thị khung dữ liệu gấu trúc hoặc một cái gì đó yêu cầu đầu ra cách điệu.
dshefman

@dshefman Vâng, điều đó là chính xác và làm cho nó dễ dàng di động cho databricks / spark notebook.
Technazi

Không phải là vấn đề khi chúng ta triển khai ô thứ nhất %%timea=1nhưng ô thứ 2 không biết đó alà gì?
Jason

3
FYI. Tôi thấy rằng các biến trong ô được kiểm tra hiện đang được xem xét vào các ô tiếp theo. (20/02/2020) - Fei
Fei Yao


44

Một cách dễ dàng hơn là sử dụng plugin ExecuteTime trong gói jupyter_contrib_nbextensions.

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime

6
Đây là câu trả lời bị đánh giá thấp nhất!
DaveR

2
với ai đó đang lặn qua biển câu trả lời: đây là câu trả lời, chỉ cần cài đặt nó và sau đó bạn sẽ thấy thời gian thực hiện trên mỗi ô theo một định dạng đẹp
El pocho la pantera

14

Tôi chỉ cần thêm %%timevào đầu tế bào và có thời gian. Bạn có thể sử dụng tương tự trên cụm Jupyter Spark / Môi trường ảo bằng cách sử dụng tương tự. Chỉ cần thêm %%timeở đầu ô và bạn sẽ nhận được đầu ra. Trên cụm tia lửa sử dụng Jupyter, tôi đã thêm vào đầu ô và tôi nhận được kết quả như bên dưới: -

[1]  %%time
     import pandas as pd
     from pyspark.ml import Pipeline
     from pyspark.ml.classification import LogisticRegression
     import numpy as np
     .... code ....

Output :-

CPU times: user 59.8 s, sys: 4.97 s, total: 1min 4s
Wall time: 1min 18s

Điều này có thực thi mã di động không. của thời gian và sau đó lấy trung bình? Và những gì về câu lệnh đầu tiên là 'mã thiết lập'?
amsquareb

14
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)

1
Hoàn hảo. Quá nhiều rắc rối để bảo vệ đối tượng khỏi %% timeit và sử dụng trong ô tiếp theo
Paul


9

Điều này không chính xác đẹp nhưng không có phần mềm bổ sung

class timeit():
    from datetime import datetime
    def __enter__(self):
        self.tic = self.datetime.now()
    def __exit__(self, *args, **kwargs):
        print('runtime: {}'.format(self.datetime.now() - self.tic))

Sau đó, bạn có thể chạy nó như:

with timeit():
    # your code, e.g., 
    print(sum(range(int(1e7))))

% 49999995000000
% runtime: 0:00:00.338492

7

Đôi khi định dạng khác nhau trong một ô khi sử dụng print(res), nhưng jupyter / ipython đi kèm với a display. Xem một ví dụ về sự khác biệt định dạng bằng cách sử dụng gấu trúc dưới đây.

%%time
import pandas as pd 
from IPython.display import display

df = pd.DataFrame({"col0":{"a":0,"b":0}
              ,"col1":{"a":1,"b":1}
              ,"col2":{"a":2,"b":2}
             })

#compare the following
print(df)
display(df)

Các displaytuyên bố có thể bảo tồn các định dạng. ảnh chụp màn hình


Điều này có thực thi mã di động không. của thời gian và sau đó lấy trung bình? Và những gì về câu lệnh đầu tiên là 'mã thiết lập'?
amsquareb

2

bạn cũng có thể muốn xem xét lệnh ma thuật định hình của python, %prunthứ mang lại một cái gì đó như -

def sum_of_lists(N):
    total = 0
    for i in range(5):
        L = [j ^ (j >> i) for j in range(N)]
        total += sum(L)
    return total

sau đó

%prun sum_of_lists(1000000)

sẽ trở lại

14 function calls in 0.714 seconds  

Ordered by: internal time      

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    5    0.599    0.120    0.599    0.120 <ipython-input-19>:4(<listcomp>)
    5    0.064    0.013    0.064    0.013 {built-in method sum}
    1    0.036    0.036    0.699    0.699 <ipython-input-19>:1(sum_of_lists)
    1    0.014    0.014    0.714    0.714 <string>:1(<module>)
    1    0.000    0.000    0.714    0.714 {built-in method exec}

Tôi thấy nó hữu ích khi làm việc với các đoạn mã lớn.


2

Khi gặp khó khăn có nghĩa là gì:

?%timeit hoặc là ??timeit

Để biết chi tiết:

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

Time execution of a Python statement or expression using the timeit
module.  This function can be used both as a line and cell magic:

- In line mode you can time a single-line statement (though multiple
  ones can be chained with using semicolons).

- In cell mode, the statement in the first line is used as setup code
  (executed but not timed) and the body of the cell is timed.  The cell
  body has access to any variables created in the setup code.

1

Nếu bạn muốn in thời gian thực hiện tế bào trên tường ở đây là một mẹo, hãy sử dụng

%%time
<--code goes here-->

nhưng ở đây đảm bảo rằng, thời gian %% là một hàm ma thuật, vì vậy hãy đặt nó ở dòng đầu tiên trong mã của bạn .

nếu bạn đặt nó sau một số dòng mã của bạn, nó sẽ cung cấp cho bạn lỗi sử dụng và sẽ không hoạt động.

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.