โค้ดในฟังก์ชันรันเร็วกว่าระดับโมดูล (global scope) หลักสองเหตุผล:
- Local variables เร็วกว่า Globals: ตัวแปร local จัดเก็บใน fixed-size array (ไม่ใช่ dict) ตอนคอมไพล์ ชื่อตัวแปร map ไปยัง index การเข้าถึงคือ pointer lookup + refcount increase เร็วมาก
- Opcode prediction: CPython (ตัวแปลภาษามาตรฐาน) คอมไพล์เป็น bytecode แล้ว interpret ใน evaluation loop ฟังก์ชันทำให้ optimizer ทำนาย opcode ได้ดีขึ้น
Global lookup ต้อง hash ใน dict ช้ากว่า Attribute lookup (เช่น obj.attr) ช้าที่สุด
นั่นคือเหตุผลที่ควรใส่โค้ดในฟังก์ชันเพื่อประสิทธิภาพ
ตัวแปร local จัดเก็บใน array เร็วกว่า global dict และ opcode prediction ทำให้ฟังก์ชันรันเร็วขึ้น