Простой способ измерить время выполнения ячейки в блокноте ipython

182

Я хотел бы получить время, затраченное на выполнение ячейки, в дополнение к исходному выводу из ячейки.

С этой целью я пытался, %%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

Какой лучший способ сделать это?

Обновить

Я использую время выполнения в Nbextension уже довольно давно. Это просто супер.

colinfang
источник
3
вам действительно нужно время отображения значения? почему бы просто не поместить xстроку дисплея в следующую ячейку?
dbliss
Почему бы не принять ответ?
raratiru

Ответы:

47

Используйте магию клеток и этот проект на github от Phillip Cloud:

Загрузите его, поместив в верхнюю часть записной книжки или в файл конфигурации, если вы всегда хотите загрузить его по умолчанию:

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

Если загружено, каждый вывод последующего выполнения ячейки будет включать время в минутах и ​​секундах, которое потребовалось для его выполнения.

Филипп Шварц
источник
15
это больше не работает, так как% install_ext устарел. Есть ли альтернатива?
eyeApps LLC
13
Существует запрос на извлечение информации, решающий эту проблему ( github.com/cpcloud/ipython-autotime/pull/5 ), который вы можете попробоватьpip install ipython-autotime
x0s
13
Теперь %%timeработает, даже если последнее утверждение нет print.
rhaps0dy
446

Единственный способ, который я нашел, чтобы преодолеть эту проблему, - выполнить последнее утверждение с помощью print.

Не забывайте, что клеточная магия начинается с, %%а магическая линия начинается с %.

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

Обратите внимание, что любые изменения, выполненные внутри ячейки, не учитываются в следующих ячейках, что противоречит интуитивно понятному при наличии конвейера: пример

Сальвадор Дали
источник
5
Теперь %% time работает даже тогда, когда последний оператор не печатается, как @ rhaps0dy указывал выше.
nealmcb
1
display (res) также работает и является предпочтительным решением при попытке отобразить кадр данных Pandas или что-то еще, что требует стилизованного вывода.
Джефман
@dshefman Да, это правильно и делает его легко переносимым для ноутбуков с базами данных / ноутбуков.
технази
Разве это не проблема, когда мы реализуем 1-ю ячейку, %%timeа a=12-я ячейка не знает, что это aтакое?
Джейсон
3
FYI. Я обнаружил, что переменные в тестируемой ячейке теперь учитываются в следующих ячейках. (20/02/2020) - Фэй
Фэй Яо
44

Более простой способ - использовать плагин ExecuteTime в пакете jupyter_contrib_nbextensions.

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime
vForce
источник
6
Это самый недооцененный ответ!
DaveR
2
кому-то, кто ныряет через море ответов: это один, просто установите его, и тогда вы увидите время выполнения каждой ячейки в хорошем формате
El pocho la pantera
14

Я просто добавил %%timeв начале ячейки и получил время. Вы можете использовать то же самое в кластере Jupyter Spark / Виртуальной среде, используя то же самое. Просто добавьте %%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
Harry_pb
источник
Выполняет ли это код ячейки по умолчанию? раз, а затем занимает среднее? А как насчет первого утверждения в качестве «кода настройки»?
amsquareb
14
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)
Mina
источник
1
Отлично. Слишком много хлопот, чтобы сохранить объект из %% timeit и использовать его в следующей ячейке
Пол
9

Это не совсем красиво, но без дополнительного программного обеспечения

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
eafit
источник
7

Иногда форматирование в ячейке отличается при использовании 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Оператор может сохранить форматирование. Скриншот

Блехман
источник
Выполняет ли это код ячейки по умолчанию? раз, а затем занимает среднее? А как насчет первого утверждения в качестве «кода настройки»?
amsquareb
2

Вы также можете заглянуть в магическую команду профилирования Python, %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}

Я считаю это полезным при работе с большими кусками кода.

markroxor
источник
2

Когда в беде, что значит что:

?%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.
прости
источник
1

Если вы хотите напечатать время выполнения ячеек на стене, это хитрость, используйте

%%time
<--code goes here-->

но здесь убедитесь, что %% time - волшебная функция, поэтому поместите ее в первую строку в своем коде .

если вы поместите его после какой-то строки кода, это приведет к ошибке при использовании и не сработает.

немиш залавадия нил
источник