Подтвердить что ты не робот

Простой способ измерения времени выполнения ячейки в ноутбуке 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 уже довольно давно. Это здорово.

4b9b3361

Ответ 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

Ответ 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

Ответ 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.