Prosty sposób pomiaru czasu wykonania komórki w notebooku ipython

Chciałbym uzyskać czas spędzony na wykonywaniu komórki oprócz oryginalnego wyjścia z komórki.

W tym celu próbowałem %%timeit -r1 -n1, ale to nie ujawnia zmiennej zdefiniowanej w komórce.

%%time działa dla komórki, która zawiera tylko 1 Instrukcję.

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
Jak najlepiej to zrobić?

Update

Używam Execute Time w Nbextension już od dłuższego czasu. Jest świetny.

Author: colinfang, 2015-09-14

8 answers

Użyj Magii komórki i tego projektu na GitHubie autorstwa Phillipa Clouda:

Załaduj go, umieszczając go na górze notatnika lub umieść w pliku konfiguracyjnym, jeśli zawsze chcesz go załadować domyślnie:

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

Po załadowaniu, każde wyjście kolejnego wykonania komórki będzie zawierać Czas w min i sek potrzebny do jej wykonania.

 23
Author: Philipp Schwarz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 09:27:25

Jedynym sposobem na rozwiązanie tego problemu jest wykonanie ostatniej instrukcji za pomocą print.

Nie zapominaj, że Magia komórek zaczyna się od %%, A magia linii zaczyna się od %.

%%time
clf = tree.DecisionTreeRegressor().fit(X_train, y_train)
res = clf.predict(X_test)
print(res)
 192
Author: Salvador Dali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-22 19:16:51

%time i %timeit teraz dołącz do wbudowanych poleceń magicznych ipythona

 35
Author: ryanmc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-07 08:19:17

Po prostu dodałem %%time na początku komórki i dostałem czas. Możesz użyć tego samego w klastrze / środowisku wirtualnym Jupyter Spark używając tego samego. Po prostu dodaj %%time na górze komórki, a otrzymasz wynik. Na klastrze spark używającym Jupyter, dodałem do górnej części komórki i dostałem wyjście jak poniżej: -

[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
 5
Author: Harry_pb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-16 16:18:47

Łatwiejszym sposobem jest użycie wtyczki ExecuteTime w pakiecie jupyter_contrib_nbextensions.

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime
 5
Author: vForce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 06:10:23

To nie jest do końca piękne, ale bez dodatkowego oprogramowania

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

Następnie można uruchomić go jak:

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

% 49999995000000
% runtime: 0:00:00.338492
 4
Author: eafit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-27 17:18:55

Czasami formatowanie jest INNE w komórce przy użyciu print(res), ale jupyter / ipython jest wyposażony w display. Zobacz przykład różnicy formatowania przy użyciu pand poniżej.

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

Instrukcja display może zachować formatowanie. zrzut ekranu

 3
Author: blehman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-15 22:46:30

Możesz również zajrzeć do magicznego polecenia profilowania Pythona %prun, które daje coś w rodzaju -

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

Wtedy

%prun sum_of_lists(1000000)

Powróci

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}

Uważam, że jest to przydatne podczas pracy z dużymi kawałkami kodu.

 0
Author: markroxor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 11:26:24