% timeit ใน python คืออะไร?


97

ฉันมักจะอ่านรหัสเพื่อคำนวณเวลาในลักษณะนี้:

%timeit function()

คุณช่วยอธิบายได้ไหมว่า "%" ที่นี่หมายถึงอะไร

ฉันคิดว่า "%" ใช้เพื่อแทนที่บางสิ่งในสตริงเสมอเช่น% s หมายถึงแทนที่สตริง% d แทนที่ข้อมูล แต่ฉันไม่รู้เกี่ยวกับกรณีนี้


16
นั่นเป็นคำสั่งวิเศษจาก iPython ดู: iPython Magics
MrAlexBailey

คำตอบ:


91

%timeitเป็นฟังก์ชันเวทย์มนตร์ ipythonซึ่งสามารถใช้เพื่อกำหนดเวลาส่วนหนึ่งของรหัส (คำสั่งการดำเนินการเดียวหรือวิธีการเดียว)

จากเอกสาร:

% timeit

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

ในการใช้งานตัวอย่างเช่นหากเราต้องการทราบว่าการใช้งานxrangeนั้นเร็วกว่าการใช้rangeหรือไม่คุณสามารถทำได้ดังนี้

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

และคุณจะได้รับการกำหนดเวลาสำหรับพวกเขา

ข้อได้เปรียบที่สำคัญ%timeitคือ:

  • ที่คุณไม่ต้องนำเข้าtimeit.timeit จากไลบรารีมาตรฐานและเรียกใช้โค้ดหลาย ๆ ครั้งเพื่อดูว่าวิธีใดเป็นแนวทางที่ดีกว่า

  • % timeit จะคำนวณจำนวนการรันที่จำเป็นสำหรับรหัสของคุณโดยอัตโนมัติตามหน้าต่างการดำเนินการทั้งหมด 2 วินาที

  • คุณยังสามารถใช้ประโยชน์จากตัวแปรคอนโซลปัจจุบันได้โดยไม่ต้องส่งข้อมูลโค้ดทั้งหมดเช่นในกรณีtimeit.timeitที่สร้างตัวแปรที่สร้างขึ้นในสภาพแวดล้อมอื่นที่หมดเวลา


1
มีวิธีกำหนดเวลามาโครหรือชุดของบรรทัดจากเชลล์ ipython หรือไม่?
alpha_989

2
@ alpha_989 ใช่คุณสามารถรวมชุดของบรรทัดเหล่านั้นไว้ในฟังก์ชันแล้วกำหนดเวลาของฟังก์ชันเช่น:%timeit function()
mu 無

@mu 無: โปรดชี้แจงtimer.timeit- นั่นคือชื่อโมดูลจริงหรือ?
Fountainhead


ผลลัพธ์10000 loops, best of 3: 29.6 µs per loopสามารถตีความได้ว่า: (1. ) นิพจน์ทำงาน 10,000 ครั้งเพื่อให้ได้เวลาทั้งหมด (2. ) จากนั้นเวลาทั้งหมดหารด้วย 10,000 เพื่อให้ได้เวลา "ต่อลูป" และ (3. ) การคำนวณเวลาทั้งหมดเสร็จ 3 ครั้งและสุดท้าย (4. ) จากทั้งหมด 3 ครั้งเวลารวมต่ำสุด (หรือที่เรียกว่า "ดีที่สุดของ 3") จะใช้เป็นผลลัพธ์ การตีความของฉันถูกต้องใช่ / ไม่ใช่?
Trevor Boyd Smith

37

สิ่งนี้เรียกว่ามายากลเส้นใน iPython พวกเขามีความโดดเด่นตรงที่อาร์กิวเมนต์ของพวกเขาขยายไปถึงจุดสิ้นสุดของบรรทัดปัจจุบันเท่านั้นและเวทมนตร์เองก็มีโครงสร้างสำหรับการพัฒนาบรรทัดคำสั่ง timeitใช้เพื่อกำหนดเวลาในการเรียกใช้โค้ด

หากคุณต้องการดูเวทมนตร์ทั้งหมดที่คุณสามารถใช้ได้คุณสามารถพิมพ์:

%lsmagic

เพื่อรับรายชื่อทั้ง Line Magics และ Cell Magics

ข้อมูลเวทมนตร์เพิ่มเติมจากเอกสารที่นี่ :

IPython มีระบบคำสั่งที่เราเรียกว่าmagicsซึ่งให้ภาษาคำสั่งขนาดเล็กอย่างมีประสิทธิภาพซึ่งตั้งฉากกับไวยากรณ์ของ Python และสามารถขยายได้โดยผู้ใช้ด้วยคำสั่งใหม่ Magics หมายถึงการพิมพ์แบบโต้ตอบดังนั้นจึงใช้รูปแบบบรรทัดคำสั่งเช่นการใช้ช่องว่างสำหรับการแยกอาร์กิวเมนต์ขีดกลางสำหรับตัวเลือกและรูปแบบอื่น ๆ ตามปกติของสภาพแวดล้อมบรรทัดคำสั่ง

ทั้งนี้ขึ้นอยู่กับว่าคุณอยู่ในสายหรือเซลล์%timeitโหมดมีสองวิธีที่แตกต่างกันในการใช้ คำถามของคุณแสดงให้เห็นถึงวิธีแรก:

In [1]: %timeit range(100)

เทียบกับ

In [1]: %%timeit 
      : x = range(100)
      :

4

IPython สกัดกั้นสิ่งเหล่านี้เรียกว่าคำสั่งเวทย์มนตร์ในตัวนี่คือรายการ: https://ipython.org/ipython-doc/dev/interactive/magics.html

คุณยังสามารถสร้างเวทมนตร์ของคุณเองได้ที่https://ipython.org/ipython-doc/dev/config/custommagics.html

คุณtimeitอยู่ที่นี่https://ipython.org/ipython-doc/dev/interactive/magics.html#magic-timeit


2

ฉันแค่อยากจะเพิ่มข้อได้เปรียบที่เป็นประโยชน์อีกอย่างของการใช้% timeit เพื่อตอบโดยmu 無ว่า:

  • คุณยังสามารถใช้ประโยชน์จากตัวแปรคอนโซลปัจจุบันได้โดยไม่ต้องส่งข้อมูลโค้ดทั้งหมดในกรณีของ timeit.timeit เพื่อสร้างตัวแปรที่สร้างขึ้นในสภาพแวดล้อมอื่นที่เวลาทำงาน

PS: ฉันรู้ว่านี่ควรเป็นความคิดเห็นที่จะตอบข้างบน แต่ตอนนี้ฉันยังไม่มีชื่อเสียงมากพอหวังว่าสิ่งที่ฉันเขียนจะเป็นประโยชน์กับใครบางคนและช่วยให้ฉันมีชื่อเสียงมากพอที่จะแสดงความคิดเห็นในครั้งต่อไป


1
คุณยังสามารถแก้ไขคำตอบของคนอื่นเพื่อปรับปรุงได้ คุณควรมีชื่อเสียงเพียงพอสำหรับสิ่งนั้น
Tarick Welling

ขอบคุณไม่รู้เรื่องนั้น @TarickWelling
Ankit Agrawal

2

ฉันแค่อยากจะเพิ่มประเด็นที่ละเอียดมากเกี่ยวกับ %% timeit เมื่อเรียกใช้ "เวทมนตร์" บนเซลล์คุณจะได้รับข้อผิดพลาด ...

UsageError: %%timeitไม่พบฟังก์ชัน Line magic

... หากมีรหัส / บรรทัดความคิดเห็นสูงกว่า %% timeit กล่าวอีกนัยหนึ่งให้แน่ใจว่า %% timeit เป็นคำสั่งแรกในเซลล์ของคุณ

ฉันรู้ว่ามันเป็นจุดเล็ก ๆ ที่ผู้เชี่ยวชาญทุกคนจะพูดว่า duh แต่แค่อยากจะเพิ่มครึ่งเซ็นต์ของฉันสำหรับพ่อมดรุ่นเยาว์ที่เริ่มต้นด้วยเล่ห์กลมายากล


1
สิ่งนี้ใช้ไม่ได้ในเชลล์ iPython เฉพาะในโน้ตบุ๊ก
Jupyter

0

Line magicsนำหน้าด้วยอักขระ%และทำงานเหมือนกับการเรียกบรรทัดคำสั่งของ OS: พวกมันได้รับอาร์กิวเมนต์ส่วนที่เหลือของบรรทัดโดยที่อาร์กิวเมนต์จะถูกส่งผ่านโดยไม่มีวงเล็บหรือเครื่องหมายคำพูด เวทมนตร์ของเซลล์ขึ้นต้นด้วย%%สองเท่าและเป็นฟังก์ชันที่ใช้เป็นอาร์กิวเมนต์ไม่เพียง แต่ส่วนที่เหลือของบรรทัดเท่านั้น แต่ยังรวมถึงบรรทัดด้านล่างในอาร์กิวเมนต์แยกต่างหาก

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