ฉันมักจะอ่านรหัสเพื่อคำนวณเวลาในลักษณะนี้:
%timeit function()
คุณช่วยอธิบายได้ไหมว่า "%" ที่นี่หมายถึงอะไร
ฉันคิดว่า "%" ใช้เพื่อแทนที่บางสิ่งในสตริงเสมอเช่น% s หมายถึงแทนที่สตริง% d แทนที่ข้อมูล แต่ฉันไม่รู้เกี่ยวกับกรณีนี้
ฉันมักจะอ่านรหัสเพื่อคำนวณเวลาในลักษณะนี้:
%timeit function()
คุณช่วยอธิบายได้ไหมว่า "%" ที่นี่หมายถึงอะไร
ฉันคิดว่า "%" ใช้เพื่อแทนที่บางสิ่งในสตริงเสมอเช่น% s หมายถึงแทนที่สตริง% d แทนที่ข้อมูล แต่ฉันไม่รู้เกี่ยวกับกรณีนี้
คำตอบ:
%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
ที่สร้างตัวแปรที่สร้างขึ้นในสภาพแวดล้อมอื่นที่หมดเวลา
%timeit function()
timer.timeit
- นั่นคือชื่อโมดูลจริงหรือ?
10000 loops, best of 3: 29.6 µs per loop
สามารถตีความได้ว่า: (1. ) นิพจน์ทำงาน 10,000 ครั้งเพื่อให้ได้เวลาทั้งหมด (2. ) จากนั้นเวลาทั้งหมดหารด้วย 10,000 เพื่อให้ได้เวลา "ต่อลูป" และ (3. ) การคำนวณเวลาทั้งหมดเสร็จ 3 ครั้งและสุดท้าย (4. ) จากทั้งหมด 3 ครั้งเวลารวมต่ำสุด (หรือที่เรียกว่า "ดีที่สุดของ 3") จะใช้เป็นผลลัพธ์ การตีความของฉันถูกต้องใช่ / ไม่ใช่?
สิ่งนี้เรียกว่ามายากลเส้นใน iPython พวกเขามีความโดดเด่นตรงที่อาร์กิวเมนต์ของพวกเขาขยายไปถึงจุดสิ้นสุดของบรรทัดปัจจุบันเท่านั้นและเวทมนตร์เองก็มีโครงสร้างสำหรับการพัฒนาบรรทัดคำสั่ง timeit
ใช้เพื่อกำหนดเวลาในการเรียกใช้โค้ด
หากคุณต้องการดูเวทมนตร์ทั้งหมดที่คุณสามารถใช้ได้คุณสามารถพิมพ์:
%lsmagic
เพื่อรับรายชื่อทั้ง Line Magics และ Cell Magics
ข้อมูลเวทมนตร์เพิ่มเติมจากเอกสารที่นี่ :
IPython มีระบบคำสั่งที่เราเรียกว่าmagicsซึ่งให้ภาษาคำสั่งขนาดเล็กอย่างมีประสิทธิภาพซึ่งตั้งฉากกับไวยากรณ์ของ Python และสามารถขยายได้โดยผู้ใช้ด้วยคำสั่งใหม่ Magics หมายถึงการพิมพ์แบบโต้ตอบดังนั้นจึงใช้รูปแบบบรรทัดคำสั่งเช่นการใช้ช่องว่างสำหรับการแยกอาร์กิวเมนต์ขีดกลางสำหรับตัวเลือกและรูปแบบอื่น ๆ ตามปกติของสภาพแวดล้อมบรรทัดคำสั่ง
ทั้งนี้ขึ้นอยู่กับว่าคุณอยู่ในสายหรือเซลล์%timeit
โหมดมีสองวิธีที่แตกต่างกันในการใช้ คำถามของคุณแสดงให้เห็นถึงวิธีแรก:
In [1]: %timeit range(100)
เทียบกับ
In [1]: %%timeit
: x = range(100)
:
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
ฉันแค่อยากจะเพิ่มข้อได้เปรียบที่เป็นประโยชน์อีกอย่างของการใช้% timeit เพื่อตอบโดยmu 無ว่า:
PS: ฉันรู้ว่านี่ควรเป็นความคิดเห็นที่จะตอบข้างบน แต่ตอนนี้ฉันยังไม่มีชื่อเสียงมากพอหวังว่าสิ่งที่ฉันเขียนจะเป็นประโยชน์กับใครบางคนและช่วยให้ฉันมีชื่อเสียงมากพอที่จะแสดงความคิดเห็นในครั้งต่อไป
ฉันแค่อยากจะเพิ่มประเด็นที่ละเอียดมากเกี่ยวกับ %% timeit เมื่อเรียกใช้ "เวทมนตร์" บนเซลล์คุณจะได้รับข้อผิดพลาด ...
UsageError: %%timeit
ไม่พบฟังก์ชัน Line magic
... หากมีรหัส / บรรทัดความคิดเห็นสูงกว่า %% timeit กล่าวอีกนัยหนึ่งให้แน่ใจว่า %% timeit เป็นคำสั่งแรกในเซลล์ของคุณ
ฉันรู้ว่ามันเป็นจุดเล็ก ๆ ที่ผู้เชี่ยวชาญทุกคนจะพูดว่า duh แต่แค่อยากจะเพิ่มครึ่งเซ็นต์ของฉันสำหรับพ่อมดรุ่นเยาว์ที่เริ่มต้นด้วยเล่ห์กลมายากล
Line magicsนำหน้าด้วยอักขระ%และทำงานเหมือนกับการเรียกบรรทัดคำสั่งของ OS: พวกมันได้รับอาร์กิวเมนต์ส่วนที่เหลือของบรรทัดโดยที่อาร์กิวเมนต์จะถูกส่งผ่านโดยไม่มีวงเล็บหรือเครื่องหมายคำพูด เวทมนตร์ของเซลล์ขึ้นต้นด้วย%%สองเท่าและเป็นฟังก์ชันที่ใช้เป็นอาร์กิวเมนต์ไม่เพียง แต่ส่วนที่เหลือของบรรทัดเท่านั้น แต่ยังรวมถึงบรรทัดด้านล่างในอาร์กิวเมนต์แยกต่างหาก