ไม่มีก็ไม่ได้
การคอมไพล์เป็นโค้ดไบต์ CPython จะถูกส่งผ่านเครื่องมือเพิ่มประสิทธิภาพช่องมองภาพขนาดเล็กที่ออกแบบมาเพื่อทำการเพิ่มประสิทธิภาพพื้นฐานเท่านั้น (ดูtest_peepholer.pyในชุดทดสอบสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มประสิทธิภาพเหล่านี้)
หากต้องการดูสิ่งที่จะเกิดขึ้นจริงให้ใช้dis
* เพื่อดูคำแนะนำที่สร้างขึ้น สำหรับฟังก์ชันแรกที่มีการกำหนด:
from dis import dis
dis(func)
2 0 LOAD_CONST 1 (42)
2 STORE_FAST 0 (a)
3 4 LOAD_FAST 0 (a)
6 RETURN_VALUE
ในขณะที่สำหรับฟังก์ชันที่สอง:
dis(func2)
2 0 LOAD_CONST 1 (42)
2 RETURN_VALUE
คำแนะนำเพิ่มเติม (เร็ว) สองคำสั่งใช้ในคำสั่งแรก: STORE_FAST
และLOAD_FAST
. สิ่งเหล่านี้ทำให้จัดเก็บอย่างรวดเร็วและคว้าค่าในfastlocals
อาร์เรย์ของกรอบการดำเนินการปัจจุบัน จากนั้นในทั้งสองกรณีRETURN_VALUE
จะดำเนินการa ดังนั้นวินาทีนั้นเร็วกว่าเล็กน้อยเนื่องจากคำสั่งที่จำเป็นในการดำเนินการน้อยลง
โดยทั่วไปโปรดทราบว่าคอมไพเลอร์ CPython เป็นแบบอนุรักษ์นิยมในการเพิ่มประสิทธิภาพที่ดำเนินการ ไม่ใช่และไม่พยายามที่จะฉลาดเท่าคอมไพเลอร์อื่น ๆ (ซึ่งโดยทั่วไปแล้วยังมีข้อมูลอีกมากมายที่ต้องทำงานด้วย) เป้าหมายหลักในการออกแบบนอกเหนือจากความถูกต้องชัดเจนคือ a) ทำให้เรียบง่ายและ b) รวบรวมสิ่งเหล่านี้ให้รวดเร็วที่สุดเท่าที่จะเป็นไปได้เพื่อที่คุณจะไม่สังเกตเห็นว่ามีขั้นตอนการรวบรวมอยู่
ในท้ายที่สุดคุณไม่ควรเดือดร้อนกับปัญหาเล็ก ๆ เช่นนี้ ประโยชน์ของความเร็วนั้นมีขนาดเล็กคงที่และแคระแกร็นด้วยค่าใช้จ่ายที่เกิดจากการตีความ Python
* dis
เป็นโมดูล Python ตัวเล็ก ๆ ที่ไม่รวมโค้ดของคุณคุณสามารถใช้เพื่อดู bytecode Python ที่ VM จะดำเนินการ
หมายเหตุ:ตามที่ระบุไว้ในความคิดเห็นของ @Jorn Vernee สิ่งนี้เฉพาะสำหรับการใช้งาน CPython ของ Python การใช้งานอื่น ๆ อาจทำการเพิ่มประสิทธิภาพเชิงรุกมากขึ้นหากต้องการ CPython ก็ไม่ทำเช่นนั้น
dis.dis(..)
ทั้งสองอย่างคุณจะเห็นว่ามีความแตกต่างกันดังนั้นใช่ แต่ในการใช้งานในโลกแห่งความเป็นจริงส่วนใหญ่ค่าใช้จ่ายนี้เมื่อเทียบกับความล่าช้าของการประมวลผลในฟังก์ชันนั้นไม่มากนัก