Chà, Câu trả lời của @mu 無 làm phiền tâm trí của tôi! Tuy nhiên, điều quan trọng là không khái quát khi đưa ra kết luận của bạn ... Bạn đang kiểm tra thời gian cho CONSTANTS không phải biến số. Đối với các biến, phép nhân dường như chậm hơn so sánh.
Đây là trường hợp thú vị hơn, trong đó các con số để được so sánh được lưu trữ trong các biến thực tế ...
import timeit
def go():
number=1000000000
print
print 'a>b, internal:',timeit.timeit(setup="a=1;b=1", stmt="a>b", number=number)
print 'a*b, internal:',timeit.timeit(setup="a=1;b=1", stmt="a*b", number=number)
print 'a>b, shell :',
%%timeit -n 1000000000 "a=1;b=1" "a>b"
print 'a*b, shell :',
%%timeit -n 1000000000 "a=1;b=1" "a*b"
go()
Kết quả cho:
a>b, internal: 51.9467676445
a*b, internal: 63.870462403
a>b, shell :1000000000 loops, best of 3: 19.8 ns per loop
a>b, shell :1000000000 loops, best of 3: 19.9 ns per loop
Và để được phục hồi trong vũ trụ;)
Để hoàn thành, hãy xem thêm một số trường hợp ... Còn nếu chúng ta có một biến và một hằng số thì sao?
import timeit
def go():
print 'a>2, shell :',
%%timeit -n 10000000 "a=42" "a>2"
print 'a*2, shell :',
%%timeit -n 10000000 "a=42" "a*2"
go()
a>2, shell :10000000 loops, best of 3: 18.3 ns per loop
a*2, shell :10000000 loops, best of 3: 19.3 ns per loop
điều gì xảy ra với bools?
import timeit
def go():
print
number=1000000000
print 'a==b : ', timeit.timeit(setup="a=True;b=False",stmt="a==b",number=number)
print 'a and b : ', timeit.timeit(setup="a=True;b=False",stmt="a and b",number=number)
print 'boolean ==, shell :',
%%timeit -n 1000000000 "a=True;b=False" "a == b"
print 'boolean and, shell :',
%%timeit -n 1000000000 "a=False;b=False" "a and b"
go()
a==b : 70.8013108982
a and b : 38.0614485665
boolean ==, shell :1000000000 loops, best of 3: 17.7 ns per loop
boolean and, shell :1000000000 loops, best of 3: 16.4 ns per loop
: D Bây giờ đây là thú vị, có vẻ như boolean và nhanh hơn ==. Tuy nhiên tất cả điều này sẽ được ok như Donald Knuth sẽ không mất ngủ của mình, cách tốt nhất để so sánh sẽ được sử dụng và ...
Trong thực tế, chúng ta nên kiểm tra numpy, mà có thể còn quan trọng hơn ...
import timeit
def go():
number=1000000 # change if you are in a hurry/ want to be more certain....
print '==== int ===='
print 'a>b : ', timeit.timeit(setup="a=1;b=2",stmt="a>b",number=number*100)
print 'a*b : ', timeit.timeit(setup="a=1;b=2",stmt="a*b",number=number*100)
setup = "import numpy as np;a=np.arange(0,100);b=np.arange(100,0,-1);"
print 'np: a>b : ', timeit.timeit(setup=setup,stmt="a>b",number=number)
print 'np: a*b : ', timeit.timeit(setup=setup,stmt="a*b",number=number)
print '==== float ===='
print 'float a>b : ', timeit.timeit(setup="a=1.1;b=2.3",stmt="a>b",number=number*100)
print 'float a*b : ', timeit.timeit(setup="a=1.1;b=2.3",stmt="a*b",number=number*100)
setup = "import numpy as np;a=np.arange(0,100,dtype=float);b=np.arange(100,0,-1,dtype=float);"
print 'np float a>b : ', timeit.timeit(setup=setup,stmt="a>b",number=number)
print 'np float a*b : ', timeit.timeit(setup=setup,stmt="a*b",number=number)
print '==== bool ===='
print 'a==b : ', timeit.timeit(setup="a=True;b=False",stmt="a==b",number=number*1000)
print 'a and b : ', timeit.timeit(setup="a=True;b=False",stmt="a and b",number=number*1000)
setup = "import numpy as np;a=np.arange(0,100)>50;b=np.arange(100,0,-1)>50;"
print 'np a == b : ', timeit.timeit(setup=setup,stmt="a == b",number=number)
print 'np a and b : ', timeit.timeit(setup=setup,stmt="np.logical_and(a,b)",number=number)
print 'np a == True : ', timeit.timeit(setup=setup,stmt="a == True",number=number)
print 'np a and True : ', timeit.timeit(setup=setup,stmt="np.logical_and(a,True)",number=number)
go()
==== int ====
a>b : 4.5121130192
a*b : 5.62955748632
np: a>b : 0.763992986986
np: a*b : 0.723006032235
==== float ====
float a>b : 6.39567713272
float a*b : 5.62149055215
np float a>b : 0.697037433398
np float a*b : 0.847941712765
==== bool ====
a==b : 6.91458288689
a and b : 3.6289697892
np a == b : 0.789666454087
np a and b : 0.724517620007
np a == True : 1.55066706189
np a and True : 1.44293071804
Một lần nữa, cùng một hành vi ... Vì vậy, tôi đoán, người ta có thể hưởng lợi bằng cách sử dụng thay cho == nói chung,
ít nhất bằng Python 2 (Python 2.7.11 | Anaconda 2.4.1 (64-bit) | (mặc định, ngày 16 tháng 2 năm 2016, 09:58:36) [MSC v.1500 64 bit (AMD64)]), nơi tôi đã thử tất cả những ...
Tôi mong đợi tất cả những ví dụ đó được lặp lại liên tục trên đường trở thành bytecode. Có lẽ thời gian bị cản trở. –
nói chung, 'bởi vì so sánh với 0 là fast' có liên quan cao nếu lập trình Z80 hoặc tương tự ... nếu không nó có thể không có gì cả, và đó chính là loại điều được nhắc tới bởi một trích dẫn nổi tiếng nhất của Knuth . Tôi có thể đoán rằng Knuth đã nói về ngôn ngữ lắp ráp thô ở đây, và nếu như vậy, cố gắng áp dụng ngôn ngữ đó vào một ngôn ngữ biên dịch/giải thích là một tổng số không gần như không liên tục. –
Khi điểm chuẩn, hãy cảnh giác với [liên tục gấp] (https://en.wikipedia.org/wiki/Constant_folding). – Schwern