Ini adalah pertanyaan lanjutan untuk jawaban yang saya berikan beberapa hari yang lalu . Sunting: tampaknya OP dari pertanyaan itu sudah menggunakan kode yang saya poskan kepadanya untuk menanyakan pertanyaan yang sama , tetapi saya tidak menyadarinya. Permintaan maaf. Jawaban yang diberikan berbeda!
Secara substansial saya mengamati bahwa:
>>> 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]
... atau dengan kata lain: memiliki elseklausa lebih cepat terlepas dari ifkondisi yang dipicu atau tidak.
Saya menganggap itu ada hubungannya dengan bytecode berbeda yang dihasilkan oleh keduanya, tetapi adakah yang bisa mengkonfirmasi / menjelaskan secara detail?
EDIT: Sepertinya tidak semua orang dapat mereproduksi timing saya, jadi saya pikir mungkin berguna untuk memberikan beberapa informasi tentang sistem saya. Saya menjalankan Ubuntu 11.10 64 bit dengan python default diinstal. pythonmenghasilkan informasi versi berikut:
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Berikut adalah hasil pembongkaran di 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- tetapi seperti yang disebutkan, itu tidak pernah tercapai) di akhir with_else. Saya sangat meragukan kode mati membuat fungsi lebih cepat. Bisakah seseorang memberikan dispada 2.7?
elsedan Falsepaling lambat dari semuanya (152ns). Tercepat kedua adalah Truetanpa else(143ns) dan dua lainnya pada dasarnya sama (137ns dan 138ns). Saya tidak menggunakan parameter default dan mengukurnya dengan %timeitdi iPython.
with_elseini lebih cepat terlihat.