Đây là một câu hỏi tiếp theo cho một câu trả lời tôi đã đưa ra một vài ngày trước . Chỉnh sửa: có vẻ như OP của câu hỏi đó đã sử dụng mã tôi đã đăng cho anh ta để hỏi cùng một câu hỏi , nhưng tôi không biết về nó. Lời xin lỗi. Các câu trả lời được cung cấp là khác nhau mặc dù!
Thực chất tôi đã quan sát thấy rằng:
>>> 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]
... Hoặc nói cách khác: có else
mệnh đề nhanh hơn bất kể if
điều kiện được kích hoạt hay không.
Tôi giả sử nó phải làm với mã byte khác nhau do hai người tạo ra, nhưng có ai có thể xác nhận / giải thích chi tiết không?
EDIT: Có vẻ như không phải ai cũng có thể sao chép thời gian của tôi, vì vậy tôi nghĩ rằng có thể hữu ích khi cung cấp một số thông tin trên hệ thống của tôi. Tôi đang chạy Ubuntu 11.10 64 bit với cài đặt python mặc định. python
tạo thông tin phiên bản sau:
Python 2.7.2+ (default, Oct 4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Dưới đây là kết quả của quá trình tháo gỡ trong 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
- nhưng như đã nêu, nó không bao giờ đạt được) vào cuối with_else
. Tôi rất nghi ngờ mã chết làm cho một chức năng nhanh hơn. Ai đó có thể cung cấp dis
trên 2.7?
else
và False
chậm nhất trong số tất cả (152ns). Nhanh thứ hai là True
không có else
(143ns) và hai cái khác về cơ bản là giống nhau (137ns và 138ns). Tôi đã không sử dụng tham số mặc định và đo nó bằng %timeit
iPython.
with_else
là nhanh hơn quan sát.