Trong mã sau đây, tại sao Python không biên dịch f2
sang cùng bytecode là f1
?Tại sao Python không đánh giá số học liên tục trước khi biên dịch sang bytecode?
Có lý do nào không?
>>> def f1(x):
x*100
>>> dis.dis(f1)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (100)
6 BINARY_MULTIPLY
7 POP_TOP
8 LOAD_CONST 0 (None)
11 RETURN_VALUE
>>> def f2(x):
x*10*10
>>> dis.dis(f2)
2 0 LOAD_FAST 0 (x)
3 LOAD_CONST 1 (10)
6 BINARY_MULTIPLY
7 LOAD_CONST 1 (10)
10 BINARY_MULTIPLY
11 POP_TOP
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
Lưu ý rằng thậm chí không có gì được chuyển cho phương thức, kết quả của 'dis' vẫn giống nhau, nếu nội dung của phương thức là:' x = 9; y = x * 10 * 10; ', kết quả vẫn là cùng viz. tải const hai lần. Có vẻ như Python không thực hiện tối ưu hóa toàn bộ phương thức? –
@ SanjayT.Sharma: Trình biên dịch vẫn không thể thực sự biết 'x' là gì, vì vậy nó phải chơi nó an toàn. Khả năng sửa đổi thời gian chạy linh hoạt và khả năng sửa đổi thời gian chạy động của Python làm cho nó có thể thay đổi kiểu 'x' bên trong các hàm địa phương. –
'x * (10 * 10)' cũng hoạt động và rõ ràng hơn một chút. – WolframH