Простой способ измерения времени выполнения ячейки в ноутбуке ipython
Я хотел бы получить время, потраченное на выполнение ячейки, в дополнение к исходному выводу из ячейки.
С этой целью я попробовал %%timeit -r1 -n1
, но не обнаружил переменную, определенную внутри ячейки.
%%time
работает для ячейки, которая содержит только 1 инструкцию.
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
Какой лучший способ сделать это?
Update
Я использую Выполнять время в Nbextension уже довольно давно. Это здорово.
Ответы
Ответ 1
Используйте клеточную магию и этот проект на github от Phillip Cloud:
Загрузите его, поместив его в верхнюю часть вашего ноутбука или поместите в свой файл конфигурации, если вы всегда хотите его загрузить по умолчанию:
%install_ext https://raw.github.com/cpcloud/ipython-autotime/master/autotime.py
%load_ext autotime
При загрузке каждый вывод последующего выполнения ячейки будет включать время в мин и секунду, которое требуется для его выполнения.
Ответ 2
Единственный способ, который я нашел, чтобы преодолеть эту проблему, - выполнить последнее утверждение с помощью print.
Не забывайте, что волшебство ячейки начинается с %%
а волшебство строки начинается с %
.
%%time
clf = tree.DecisionTreeRegressor().fit(X_train, y_train)
res = clf.predict(X_test)
print(res)
Обратите внимание, что любые изменения, выполненные внутри ячейки, не учитываются в следующих ячейках, что противоречит интуитивно понятному при наличии конвейера: ![an example]()
Ответ 3
%time
и %timeit
теперь входят в состав встроенных ipython магических команд
Ответ 4
Более простой способ - использовать плагин ExecuteTime в пакете jupyter_contrib_nbextensions.
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime
Ответ 5
Я просто добавил %%time
в начале ячейки и получил время. Вы можете использовать то же самое в Jupyter Spark cluster/Virtual environment, используя то же самое. Просто добавьте %%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
Ответ 6
Иногда форматирование в ячейке отличается при использовании 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
может сохранить форматирование. ![screenshot]()
Ответ 7
Это не совсем красиво, но без дополнительного программного обеспечения
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
Ответ 8
Для этого вы можете использовать магическую функцию timeit
.
%timeit CODE_LINE
Или в камере
%%timeit
SOME_CELL_CODE
Проверьте больше магических функций IPython на https://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb
Ответ 9
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)
Ответ 10
вы также можете захотеть взглянуть на python profiling magic command %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}
Я считаю это полезным при работе с большими кусками кода.
Ответ 11
Когда в беде, что значит что:
?%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.