Простий спосіб вимірювання часу виконання комірок у ноутбуці 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

Який найкращий спосіб це зробити?

Оновлення

Я використовую Execute Time в Nbextension вже досить давно. Це здорово.


3
чи дійсно потрібно вчасно відобразити значення? чому б просто не помістити xрядок відображення в наступну клітинку?
dbliss

Чому б не прийняти відповідь?
raratiru

Відповіді:


46

Використовуйте магію клітин та цей проект на 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.
rahaps0dy

444

Єдиний спосіб, який я знайшов, щоб подолати цю проблему - це виконати останнє твердження з друком.

Не забувайте, що магія клітини починається з %%і починається лінійна магія %.

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

Зауважте, що будь-які зміни, проведені всередині комірки, не беруться до уваги в наступних клітинках, що є протилежним інтуїтивно зрозумілим, коли є конвеєр: приклад


5
Зараз %% час працює навіть тоді, коли остання заява не друкується, як @ rhaps0dy вказувало вище.
nealmcb

1
дисплей (res) також працює і є кращим рішенням при спробі відображення фрейму даних панди чи чогось іншого, що вимагає стилізованого виводу.
dshefman

@dshefman Так, це правильно і робить його легким портативним і для ноутбуків даних, і для ноутбуків.
технозі

Хіба це не проблема , коли ми реалізуємо 1 - ю осередок %%timeі , a=1але друга клітина не знає , що 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

6
Це найбільш занижена відповідь!
DaveR

2
щоб хтось пірнав через море відповідей: це той, просто встановіть його, і тоді ви побачите час виконання кожної комірки у приємному форматі
El pocho la pantera

14

Я просто додав %%timeна початку комірки і отримав час. Ви можете використовувати те ж саме у кластері / віртуальному середовищі Jupyter Spark, використовуючи те саме. Просто додайте %%timeвгорі клітинки, і ви отримаєте вихід. На іскровому кластері за допомогою Юпітера я додав у верхню частину клітинки і отримав вихід, як нижче:

[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

Чи виконує це код комірки за замовчуванням ні. разів, а потім бере середнє? А як щодо першого твердження як "коду настройки"?
amsquareb

14
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)

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

7

Іноді форматування в комірці відрізняється під час використання print(res), але jupyter / ipython поставляється із a 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}

Мені здається корисним при роботі з великими фрагментами коду.


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

але тут переконайтеся, що %% час - це магічна функція, тому поставте його на перший рядок у своєму коді .

якщо ви введете його після деякого рядка коду, він дасть вам помилку використання, і він не працюватиме.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.