ipython 노트북에서 셀 실행 시간을 측정하는 간단한 방법


182

셀의 원래 출력 외에도 셀 실행에 소요되는 시간을 얻고 싶습니다.

이를 위해 시도 %%timeit -r1 -n1했지만 셀 내에 정의 된 변수를 노출하지 않습니다.

%%time 하나의 문장 만 포함하는 셀에서 작동합니다.

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

가장 좋은 방법은 무엇입니까?

최신 정보

나는 지금 꽤 오랫동안 Nbextension에서 Execute Time을 사용하고 있습니다. 훌륭합니다.


3
실제로 값 표시 시간을 정해야합니까? 왜 x다음 셀에 디스플레이 라인을 넣지 않겠습니까?
dbliss

왜 대답을 받아들이지 않습니까?
raratiru

답변:


46

Phillip Cloud의 github에서 cell magic 및이 프로젝트를 사용하십시오.

항상 기본적으로로드하려면 노트북 상단에 이것을 넣거나 구성 파일에 넣으십시오.

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

로드되면, 후속 셀 실행의 모든 ​​출력에는 실행에 소요 된 시간 (분 및 초)이 포함됩니다.


15
% install_ext는 더 이상 사용되지 않으므로 더 이상 작동하지 않습니다. 대안이 있습니까?
eyeApps LLC 1

13
이 문제를 해결하는 풀 요청 ( github.com/cpcloud/ipython-autotime/pull/5 )이 있습니다. 다음을 시도해보십시오pip install ipython-autotime
x0s

13
이제 %%time마지막 진술이 아닌 경우에도 작동합니다 print.
rhaps0dy

444

이 문제를 극복하는 유일한 방법은 print로 마지막 문장을 실행하는 것입니다.

셀 매직은로 시작 %%하고 라인 매직은로 시작 한다는 것을 잊지 마십시오% .

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

셀 내부에서 수행 된 모든 변경 사항은 다음 셀에서 고려되지 않습니다. 파이프 라인이있을 때는 직관적이지 않습니다. 예


5
이제 @ rhaps0dy가 위에서 지적한 것처럼 %% time은 마지막 명령문이 인쇄되지 않은 경우에도 작동합니다.
nealmcb

1
display (res)도 작동하며 팬더 데이터 프레임 또는 양식 출력이 필요한 다른 것을 표시하려고 할 때 선호되는 솔루션입니다.
dshefman

@dshefman 예, 정확하고 데이터 브릭 / 스파크 노트북에도 쉽게 이식 할 수 있습니다.
technazi

우리가 첫 번째 셀을 구현 문제가되지 않습니다 %%timea=1하지만 2 차 전지가 무엇인지 모르는 a입니까?
Jason

3
참고로 테스트 된 셀의 변수가 이제 다음 셀로 고려됩니다. (20/02/2020)-Fei
Fei Yao


44

더 쉬운 방법은 jupyter_contrib_nbextensions 패키지에서 ExecuteTime 플러그인을 사용하는 것입니다.

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

6
이것은 가장 과소 평가 된 답변입니다!
DaveR

2
답변 바다를 통해 다이빙 누군가에게 : 이것은 하나입니다, 그냥 설치 한 다음 당신은 멋진 형식으로 각 셀에서 실행 시간을 볼 수 있습니다
El pocho la pantera

14

나는 단순히 %%time세포의 시작 부분에 추가 하고 시간을 얻었다. Jupyter Spark 클러스터 / 가상 환경에서도 동일하게 사용할 수 있습니다. %%time셀 상단에 추가 하면 출력을 얻을 수 있습니다. Jupyter를 사용하는 스파크 클러스터에서 셀 상단에 추가하고 다음과 같이 출력했습니다.

[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

셀 코드를 기본값 no로 실행합니까? 몇 번이고 평균을 취합니까? 그리고 '설정 코드'라는 첫 번째 문장은 어떻습니까?
amsquareb

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

1
완전한. 개체를 %% timeit에서 보존하고 다음 셀에서 사용하기에는 너무 번거 로움
Paul


9

이것은 정확히 아름답지는 않지만 추가 소프트웨어가없는

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

그런 다음 다음과 같이 실행할 수 있습니다.

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

% 49999995000000
% runtime: 0:00:00.338492

7

을 사용할 때 셀의 형식이 다른 경우가 print(res)있지만 jupyter / ipython에는 display. 아래의 팬더를 사용한 형식 차이의 예를 참조하십시오.

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

display문은 서식을 보존 할 수 있습니다. 스크린 샷


셀 코드를 기본값 no로 실행합니까? 몇 번이고 평균을 취합니까? 그리고 '설정 코드'라는 첫 번째 문장은 어떻습니까?
amsquareb

2

당신은 또한 파이썬의 프로파일 마법의 명령에보고 할 수 %prun같은 것을 제공합니다 -

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

그때

%prun sum_of_lists(1000000)

돌아올 것이다

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}

큰 코드 덩어리로 작업 할 때 유용하다는 것을 알았습니다.


2

곤경에 처했을 때 무엇을 의미합니까?

?%timeit 또는 ??timeit

세부 사항을 얻으려면 다음을 수행하십시오.

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

월 셀 실행 시간을 인쇄하려면 여기 트릭이 필요합니다.

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

그러나 여기서 %% time 은 마법 함수이므로 코드의 첫 번째 줄에 넣으십시오. .

코드 줄 뒤에 넣으면 사용법 오류가 발생하고 작동하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.