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.


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.


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


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

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

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)

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

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


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.


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.

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.