วิธีง่ายๆในการวัดเวลาดำเนินการของเซลล์ในโน้ตบุ๊ก 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
rhaps0dy

444

วิธีเดียวที่ฉันพบเพื่อเอาชนะปัญหานี้คือการดำเนินการคำสั่งสุดท้ายด้วยการพิมพ์

อย่าลืมว่าเซลล์เริ่มต้นด้วยความมหัศจรรย์และความมหัศจรรย์เส้นเริ่มต้นด้วย%%%

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

โปรดสังเกตว่าการเปลี่ยนแปลงใด ๆ ที่ดำเนินการภายในเซลล์จะไม่นำมาพิจารณาในเซลล์ถัดไปสิ่งที่ใช้งานได้ง่ายเมื่อมีไปป์ไลน์: ตัวอย่าง


5
ตอนนี้เวลา %% ทำงานได้แม้ว่าคำสั่งสุดท้ายจะไม่พิมพ์ตามที่ @ rhaps0dy ชี้ไปที่
nealmcb

1
display (res) ยังใช้งานได้และเป็นวิธีการแก้ปัญหาที่แนะนำเมื่อพยายามที่จะแสดง dataframe แพนด้าหรืออย่างอื่นที่ต้องมีการส่งออกสไตล์
dshefman

@dshefman ใช่แล้วถูกต้องและทำให้พกพาง่ายสำหรับชุดข้อมูล / โน้ตบุ๊กประกายเช่นกัน
technazi

ไม่เป็นปัญหาหรือไม่เมื่อเราใช้เซลล์ที่ 1 %%timeและเซลล์a=1ที่ 2 ไม่รู้ว่าเกิดaอะไรขึ้น
Jason

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
นี่คือคำตอบที่ underrated มากที่สุด!
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

สิ่งนี้ดำเนินการรหัสเซลล์เป็นค่าเริ่มต้นหรือไม่ ครั้งแล้วใช้เวลาเฉลี่ย? และสิ่งที่เกี่ยวกับคำสั่งแรกเป็น 'รหัสการติดตั้ง'?
amsquareb

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

1
สมบูรณ์ มันยุ่งยากมากเกินไปที่จะสงวนวัตถุจาก %% timeit และใช้ในเซลล์ถัดไป
Paul


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

คุณอาจต้องการดูคำสั่งเวทมนต์ของงูใหญ่%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-->

แต่ที่นี่ให้แน่ใจว่าที่เวลา %%เป็นหน้าที่มายากลเพื่อวางมันไว้ที่บรรทัดแรกในรหัสของคุณ

หากคุณใส่รหัสหลังจากบรรทัดของคุณมันจะทำให้เกิดข้อผิดพลาดในการใช้งานและจะไม่ทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.