Ipython not defterinde hücre yürütme süresini ölçmenin basit yolu


182

Hücreden orijinal çıktıya ek olarak hücre yürütülmesi için harcanan zamanı almak istiyorum.

Bu amaçla, denedim %%timeit -r1 -n1ama hücre içinde tanımlanan değişkeni ortaya çıkarmaz.

%%time yalnızca 1 ifade içeren hücre için çalışır.

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

Bunu yapmanın en iyi yolu nedir?

Güncelleme

Nbextension'da Execute Time'ı oldukça uzun süredir kullanıyorum . Bu harika.


3
gerçekten değerin görüntülenmesini zamanlamanız gerekiyor mu? neden xekran satırını bir sonraki hücreye koymuyorsunuz?
dbliss

Neden bir cevap kabul etmiyorsunuz?
raratiru

Yanıtlar:


46

Phillip Cloud'un github'daki hücre büyüsünü ve bu projeyi kullanın:

Bunu her zaman varsayılan olarak yüklemek istiyorsanız bunu not defterinizin üstüne veya yapılandırma dosyanıza koyarak yükleyin:

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

Yüklenirse, sonraki hücre yürütme işleminin her çıktısı, dakikayı saniye ve saniye olarak içerecektir.


15
% install_ext kullanımdan kaldırıldığı için bu artık çalışmaz. Bir alternatif var mı?
eyeApps LLC

13
Bu sorunu adresleyen bir Çekme İsteği var ( github.com/cpcloud/ipython-autotime/pull/5 ) o zaman deneyebilirsinizpip install ipython-autotime
x0s

13
Şimdi %%timeson ifade olmasa bile çalışır print.
rhaps0dy

444

Bu sorunun üstesinden gelmenin tek yolu son ifadeyi print ile çalıştırmaktır.

Unutmayın ile hücre sihirli başlar %%ve hat sihirli başlar %.

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

Hücre içinde yapılan değişikliklerin bir sonraki hücrelerde dikkate alınmadığına dikkat edin, bir boru hattı olduğunda sezgisel bir şey: Bir örnek


5
Şimdi %% time, son ifade yazdırılmadığında bile çalışıyor, çünkü @ rhaps0dy yukarıda belirtildiği gibi.
nealmcb

1
display (res) de çalışır ve bir panda veri çerçevesi veya stilize çıktı gerektiren başka bir şey görüntülemeye çalışırken tercih edilen çözümdür.
dshefman

@ dshefman Evet bu doğru ve veritabanları / kıvılcım dizüstü bilgisayarlar için de taşınabilir.
technazi

Biz 1 hücresini uygulamak bir sorun değildir %%timeve a=1ancak 2 hücre bilmez ami?
Jason

3
Bilginize. Test edilen hücredeki değişkenlerin şimdi sonraki hücrelere dahil edildiğini buldum. - 20.02.2020 - Fei
Fei Yao


44

Daha kolay bir yol, jupyter_contrib_nbextensions paketinde ExecuteTime eklentisini kullanmaktır.

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

6
Bu en önemsiz cevap!
DaveR

2
Birine dalış cevapları deniz düşünce: bu olanı, sadece yükleyin ve sonra her hücre güzel bir biçimde yürütme zamanı göreceksiniz
El pocho la pantera

14

Basitçe %%timehücrenin başına ekledim ve zamanı aldım. Aynısını kullanarak Jupyter Spark kümesi / Sanal ortamında da kullanabilirsiniz. Sadece %%timehücrenin en üstüne ekleyin ve çıktıyı alacaksınız. Jupyter kullanarak kıvılcım kümesinde, hücrenin üstüne ekledim ve aşağıdaki gibi çıktı aldım: -

[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

Bu, hücre kodunu varsayılan bir no yürütür. ve sonra ortalama alır? Peki ya 'kurulum kodu' olarak ilk ifade?
amsquareb

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

1
Mükemmel. Nesneyi %% timeit'den korumak ve bir sonraki hücrede kullanmak çok zor
Paul


9

Bu tam olarak güzel değil, ekstra yazılım olmadan

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

Sonra şöyle çalıştırabilirsiniz:

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

% 49999995000000
% runtime: 0:00:00.338492

7

Bazen biçimlendirme bir hücrede kullanılırken farklıdır print(res), ancak jupyter / ipython ile birlikte gelir display. Aşağıdaki pandaları kullanarak biçimlendirme farkı örneğine bakın.

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

displayDeyim biçimlendirmeyi koruyabilirsiniz. ekran görüntüsü


Bu, hücre kodunu varsayılan bir no yürütür. ve sonra ortalama alır? Peki ya 'kurulum kodu' olarak ilk ifade?
amsquareb

2

ayrıca python'un profilli sihirli komutuna bakmak isteyebilirsiniz %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

sonra

%prun sum_of_lists(1000000)

dönecek

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}

Büyük kod parçalarıyla çalışırken faydalı buluyorum.


2

Başın belada olduğunda ne anlama gelir:

?%timeit veya ??timeit

Ayrıntıları almak için:

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

Duvar hücresi yürütme süresini yazdırmak istiyorsanız burada bir hile, kullanın

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

ancak burada, %% zamanının sihirli bir işlev olduğundan emin olun , bu yüzden onu kodunuzun ilk satırına koyun .

Eğer kodunuzun bir satırından sonra koyarsanız, size kullanım hatası verir ve çalışmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.