Cara sederhana untuk mengukur waktu eksekusi sel di notebook ipython

182

Saya ingin mendapatkan waktu yang dihabiskan untuk eksekusi sel di samping output asli dari sel.

Untuk tujuan ini, saya mencoba %%timeit -r1 -n1 tetapi tidak mengekspos variabel yang didefinisikan dalam sel.

%%time berfungsi untuk sel yang hanya berisi 1 pernyataan.

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

Apa cara terbaik untuk melakukannya?

Memperbarui

Saya telah menggunakan Execute Time di Nbextension untuk beberapa waktu sekarang. Sangat bagus.

colinfang
sumber
3
apakah Anda benar-benar perlu mengatur waktu tampilan nilai? mengapa tidak meletakkan xgaris tampilan di sel berikutnya?
dbliss
Mengapa tidak menerima jawaban?
raratiru

Jawaban:

46

Gunakan sihir sel dan proyek ini di github oleh Phillip Cloud:

Muat dengan meletakkan ini di bagian atas buku catatan Anda atau taruh di file konfigurasi Anda jika Anda selalu ingin memuatnya secara default:

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

Jika dimuat, setiap output dari eksekusi sel selanjutnya akan menyertakan waktu dalam menit dan detik yang diperlukan untuk menjalankannya.

Philipp Schwarz
sumber
15
ini tidak lagi berfungsi, karena% install_ext sudah tidak digunakan lagi. Apakah ada alternatif?
eyeApps LLC
13
Ada Permintaan Tarik yang mengatasi masalah ini ( github.com/cpcloud/ipython-autotime/pull/5 ) maka Anda dapat mencobapip install ipython-autotime
x0s
13
Sekarang %%timeberfungsi bahkan ketika pernyataan terakhir tidak print.
rhaps0dy
443

Satu-satunya cara saya menemukan untuk mengatasi masalah ini adalah dengan mengeksekusi pernyataan terakhir dengan cetak.

Jangan lupa bahwa sihir sel dimulai dengan %%dan sihir garis dimulai dengan %.

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

Perhatikan bahwa setiap perubahan yang dilakukan di dalam sel tidak dipertimbangkan dalam sel berikutnya, sesuatu yang kontra intuitif ketika ada pipa: sebuah contoh

Salvador Dali
sumber
5
Sekarang %% waktu berfungsi bahkan ketika pernyataan terakhir tidak dicetak, seperti @ rhaps0dy tunjukkan di atas.
nealmcb
1
display (res) juga berfungsi dan merupakan solusi yang lebih disukai ketika mencoba untuk menampilkan bingkai data panda atau sesuatu yang lain yang membutuhkan output bergaya.
dshefman
@dshefman Ya itu benar dan membuatnya mudah dibawa-bawa untuk laptop juga.
technazi
Bukankah ini masalah ketika kita mengimplementasikan sel ke-1 %%timedan a=1tetapi sel ke-2 tidak tahu apaa itu?
Jason
3
FYI. Saya menemukan bahwa variabel dalam sel yang diuji sekarang dipertimbangkan ke dalam sel berikutnya. (20/02/2020) - Fei
Fei Yao
44

Cara yang lebih mudah adalah dengan menggunakan plugin ExecuteTime dalam paket jupyter_contrib_nbextensions.

pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
jupyter nbextension enable execute_time/ExecuteTime
v memaksa
sumber
6
Ini adalah jawaban yang paling diremehkan!
DaveR
2
untuk seseorang yang menyelam melalui jawaban laut: ini adalah satu, cukup instal dan kemudian Anda akan melihat waktu eksekusi pada setiap sel dalam format yang bagus
El pocho la pantera
14

Saya hanya menambahkan %%timedi awal sel dan mendapatkan waktu. Anda dapat menggunakan hal yang sama pada gugus Jupyter Spark / lingkungan Virtual menggunakan hal yang sama. Cukup tambahkan %%timedi bagian atas sel dan Anda akan mendapatkan hasilnya. Pada kluster percikan menggunakan Jupyter, saya menambahkan ke bagian atas sel dan saya mendapatkan output seperti di bawah ini: -

[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
sumber
Apakah ini mengeksekusi kode sel no default. kali dan kemudian mengambil rata-rata? Dan bagaimana dengan pernyataan pertama sebagai 'kode pengaturan'?
amsquareb
14
import time
start = time.time()
"the code you want to test stays here"
end = time.time()
print(end - start)
mina
sumber
1
Sempurna. Terlalu merepotkan untuk mempertahankan objek dari %% timeit dan digunakan di sel berikutnya
Paul
9

Ini tidak persis indah tetapi tanpa perangkat lunak tambahan

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

Maka Anda dapat menjalankannya seperti:

with timeit():
    # your code, e.g., 
    print(sum(range(int(1e7))))

% 49999995000000
% runtime: 0:00:00.338492
eafit
sumber
7

Kadang-kadang format berbeda dalam sel saat menggunakan print(res), tetapi jupyter / ipython datang dengan display. Lihat contoh perbedaan pemformatan menggunakan panda di bawah ini.

%%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 displaypernyataan dapat melestarikan format. tangkapan layar

blehman
sumber
Apakah ini mengeksekusi kode sel no default. kali dan kemudian mengambil rata-rata? Dan bagaimana dengan pernyataan pertama sebagai 'kode pengaturan'?
amsquareb
2

Anda mungkin juga ingin melihat perintah sihir profil python %prunyang memberikan sesuatu seperti -

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

kemudian

%prun sum_of_lists(1000000)

akan kembali

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}

Saya merasa berguna ketika bekerja dengan potongan kode besar.

markroxor
sumber
2

Ketika dalam kesulitan apa artinya apa:

?%timeit atau ??timeit

Untuk mendapatkan detailnya:

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.
prosti
sumber
1

Jika Anda ingin mencetak waktu eksekusi sel dinding di sini adalah trik, gunakan

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

tetapi di sini pastikan bahwa, %% time adalah fungsi ajaib, jadi letakkan di baris pertama dalam kode Anda .

jika Anda meletakkannya setelah beberapa baris kode Anda itu akan memberi Anda kesalahan penggunaan dan tidak akan bekerja.

nemish zalavadiya neel
sumber