Tôi đang xem các ví dụ được đề cập here và đang xem this example. Tôi chạy một ví dụ mẫu dưới đây về ipython, và kết quả là phù hợp, ví dụ, "%d"
là chậm hơn so với "%s"
:Tại sao% s nhanh hơn% d để thay thế số nguyên trong python?
In [1]: def m1():
...: return "%d" % (2*3/5)
In [2]: def m2():
...: return "%s" % (2*3/5)
In [4]: %timeit m1()
1000000 loops, best of 3: 529 ns per loop
In [5]: %timeit m2()
1000000 loops, best of 3: 192 ns per loop
In [6]: from dis import dis
In [7]: dis(m1)
2 0 LOAD_CONST 1 ('%d')
3 LOAD_CONST 5 (6)
6 LOAD_CONST 4 (5)
9 BINARY_DIVIDE
10 BINARY_MODULO
11 RETURN_VALUE
In [9]: dis(m2)
2 0 LOAD_CONST 1 ('%s')
3 LOAD_CONST 5 (6)
6 LOAD_CONST 4 (5)
9 BINARY_DIVIDE
10 BINARY_MODULO
11 RETURN_VALUE
Cả khối mã tương tự, và thậm chí cả đầu ra của bộ phận phân tách là giống nhau, vậy tại sao là "%s"
nhanh hơn "%d"
?
Nó rõ ràng là việc thực hiện quá tải BINARY_MODULO, không phải là bất kỳ lời giải thích ;-) Không liên quan .. khi nào Python bắt đầu làm việc gấp liên tục ('2 * 3')? – thebjorn
Tôi không chắc tại sao sự khác biệt lại ở đó, nhưng điều làm cho sự khác biệt về thời gian không xảy ra bên trong mã byte bytecode, nhưng trong việc thực hiện toán tử modulo, điều này có thể xảy ra trong C. Nếu tôi không lầm tại sao nó không hiển thị trong quá trình tháo gỡ. – bigblind
Chỉ cần lưu ý: sự khác biệt giữa hai xảy ra bên trong toán tử mô đun, vì vậy nó sẽ không xuất hiện trong bytecode của hàm sử dụng toán tử đó. – BrenBarn