นี่คือคำถามที่ติดตามคำตอบผมให้ไม่กี่วันกลับ แก้ไข:ดูเหมือนว่า OP ของคำถามนั้นได้ใช้รหัสที่ฉันโพสต์ไปหาเขาเพื่อถามคำถามเดียวกันแต่ฉันไม่รู้ตัว ขอโทษ. คำตอบที่ให้นั้นแตกต่างกัน!
ฉันสังเกตเห็นว่า:
>>> def without_else(param=False):
... if param:
... return 1
... return 0
>>> def with_else(param=False):
... if param:
... return 1
... else:
... return 0
>>> from timeit import Timer as T
>>> T(lambda : without_else()).repeat()
[0.3011460304260254, 0.2866089344024658, 0.2871549129486084]
>>> T(lambda : with_else()).repeat()
[0.27536892890930176, 0.2693932056427002, 0.27011704444885254]
>>> T(lambda : without_else(True)).repeat()
[0.3383951187133789, 0.32756996154785156, 0.3279120922088623]
>>> T(lambda : with_else(True)).repeat()
[0.3305950164794922, 0.32186388969421387, 0.3209099769592285]
... หรือกล่าวอีกนัยหนึ่ง: การมีส่วนelse
คำสั่งเร็วขึ้นโดยไม่คำนึงถึงif
เงื่อนไขที่ถูกกระตุ้นหรือไม่
ฉันคิดว่ามันเกี่ยวข้องกับ bytecode ที่สร้างขึ้นโดยสองคนนี้ แต่ทุกคนสามารถยืนยัน / อธิบายโดยละเอียดได้หรือไม่?
แก้ไข:ดูเหมือนว่าทุกคนไม่สามารถกำหนดเวลาของฉันได้ดังนั้นฉันคิดว่ามันอาจมีประโยชน์ในการให้ข้อมูลบางอย่างในระบบของฉัน ฉันใช้ Ubuntu 11.10 64 บิตโดยติดตั้งไพ ธ อนเริ่มต้นไว้ python
สร้างข้อมูลรุ่นต่อไปนี้:
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
นี่คือผลลัพธ์ของการถอดแยกชิ้นส่วนใน Python 2.7:
>>> dis.dis(without_else)
2 0 LOAD_FAST 0 (param)
3 POP_JUMP_IF_FALSE 10
3 6 LOAD_CONST 1 (1)
9 RETURN_VALUE
4 >> 10 LOAD_CONST 2 (0)
13 RETURN_VALUE
>>> dis.dis(with_else)
2 0 LOAD_FAST 0 (param)
3 POP_JUMP_IF_FALSE 10
3 6 LOAD_CONST 1 (1)
9 RETURN_VALUE
5 >> 10 LOAD_CONST 2 (0)
13 RETURN_VALUE
14 LOAD_CONST 0 (None)
17 RETURN_VALUE
LOAD_CONST(None); RETURN_VALUE
- แต่ตามที่ระบุไว้ก็ไม่ถึง) with_else
ในตอนท้ายของ ฉันสงสัยรหัสตายทำให้ฟังก์ชั่นเร็วขึ้น มีคนให้dis
2.7 หรือไม่?
else
และFalse
ช้าที่สุดของพวกเขาทั้งหมด (152ns) เร็วที่สุดที่สองคือTrue
ไม่มีelse
(143ns) และอีกสองคนนั้นเหมือนกัน (137ns และ 138ns) ฉันไม่ได้ใช้พารามิเตอร์เริ่มต้นและวัดด้วย%timeit
ใน iPython
with_else
เป็น observably ได้เร็วขึ้น