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 else
klausa lebih cepat terlepas dari if
kondisi 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. python
menghasilkan 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 dis
pada 2.7?
else
dan False
paling lambat dari semuanya (152ns). Tercepat kedua adalah True
tanpa else
(143ns) dan dua lainnya pada dasarnya sama (137ns dan 138ns). Saya tidak menggunakan parameter default dan mengukurnya dengan %timeit
di iPython.
with_else
ini lebih cepat terlihat.