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?
Ich benutze Execute Time in Nbextension seit einiger Zeit. Es ist toll.
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.
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:
%time
und %timeit
ist jetzt Teil von ipythons eingebautem magischen Befehlen
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
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
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)
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
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)
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.
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
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.