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



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



С этой целью, я пробовал %%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 уже довольно давно. Это отличный.

748   8  

8 ответов:

используйте cell magic и этот проект на github от Phillip Cloud:

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

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

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

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

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

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

%time и %timeit теперь приходите часть встроенного ipython магия команды

Я просто добавил %%time в начале ячейки и есть время. Вы можете использовать то же самое в кластере Jupyter Spark/ виртуальной среде, используя то же самое. Просто добавьте %%time в верхней части ячейки, и вы получите на выходе. На кластере spark с помощью 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

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

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime

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

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

иногда форматирование отличается в ячейке при использовании 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)

The display оператор может сохранить форматирование. screenshot

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

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

Comments

    Ничего не найдено.