wake-up-neo.com

Einfache Methode zum Messen der Ausführungszeit von Zellen in ipython notebook

Ich möchte die für die Zellenausführung aufgewendete Zeit zusätzlich zur ursprünglichen Ausgabe von cell erhalten.

Zu diesem Zweck versuchte ich %%timeit -r1 -n1 macht jedoch die in der Zelle definierte Variable nicht verfügbar.

%%time funktioniert für eine Zelle, die nur eine Anweisung enthält.

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

Wie geht das am besten?

Aktualisieren

Ich benutze Execute Time in Nbextension seit einiger Zeit. Es ist toll.

128
colinfang

Verwende Cell Magic und dieses Projekt auf Github von Phillip Cloud:

Laden Sie es, indem Sie es oben in Ihr Notizbuch einfügen, oder fügen Sie es in Ihre Konfigurationsdatei ein, wenn Sie es standardmäßig immer laden möchten:

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

Wenn geladen, enthält jede Ausgabe der nachfolgenden Zellenausführung die Zeit in Minuten und Sekunden, die zur Ausführung benötigt wurde.

29
Philipp Schwarz

Die einzige Möglichkeit, dieses Problem zu lösen, besteht darin, die letzte Anweisung mit print auszuführen.

Vergiss das nicht Zellmagie beginnt mit %% und Zeilenmagie beginnt mit %.

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

Beachten Sie, dass alle in der Zelle vorgenommenen Änderungen in den nächsten Zellen nicht berücksichtigt werden, was bei einer Pipeline nicht intuitiv ist: an example

342
Salvador Dali

%time und %timeit ist jetzt Teil von ipythons eingebautem magischen Befehlen

48
ryanmc

Eine einfachere Möglichkeit ist die Verwendung des ExecuteTime-Plugins im Paket jupyter_contrib_nbextensions.

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

Ich habe einfach %%time Am Anfang der Zelle hinzugefügt und die Zeit bekommen. Sie können dasselbe auf Jupyter Spark Cluster/Virtual Environment mit demselben Code verwenden. Fügen Sie einfach %%time Am oberen Rand der Zelle hinzu, und Sie erhalten die Ausgabe. On spark Cluster mit Jupyter, ich habe oben in der Zelle hinzugefügt und ich habe die Ausgabe wie folgt: -

[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
11
Harry_pb

Manchmal ist die Formatierung in einer Zelle anders, wenn print(res) verwendet wird, aber jupyter/ipython wird mit einem display geliefert. Ein Beispiel für den Unterschied in der Formatierung finden Sie weiter unten unter pandas.

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

Die Anweisung display kann die Formatierung beibehalten. screenshot

7
blehman

Das ist nicht gerade schön, aber ohne zusätzliche Software

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

Dann können Sie es wie folgt ausführen:

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

% 49999995000000
% runtime: 0:00:00.338492
6
eafit
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)
2
mina

vielleicht möchten Sie auch in Pythons Profiling Magic-Befehl %prun nachsehen, der ungefähr Folgendes enthält:

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

dann

%prun sum_of_lists(1000000)

wird zurückkehren

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}

Ich finde es nützlich, wenn ich mit großen Codestücken arbeite.

1
markroxor

Sie können dafür die magische Funktion timeit verwenden.

%timeit CODE_LINE

Oder in der Zelle

%%timeit SOME_CELL_CODE

Weitere IPython Magic-Funktionen finden Sie unter https://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb

1
Mostafa Gazar

Wenn in Schwierigkeiten, was bedeutet was:

?%timeit oder ??timeit

So erhalten Sie die Details:

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.
0
prosti