Is & faster than % when checking for odd numbers?

前端 未结 8 946
鱼传尺愫
鱼传尺愫 2020-11-30 04:13

To check for odd and even integer, is the lowest bit checking more efficient than using the modulo?

>>> def isodd(num):
        return num & 1 a         


        
8条回答
  •  无人及你
    2020-11-30 04:41

    Using Python 3.6 the answer is no. Using the code bellow on a 2017 MBP shows that using modulo is faster.

    # odd.py
    from datetime import datetime
    
    iterations = 100_000_000
    
    
    def is_even_modulo(n):
        return not n % 2
    
    
    def is_even_and(n):
        return not n & 1
    
    
    def time(fn):
        start = datetime.now()
        for i in range(iterations, iterations * 2):
            fn(i)
        print(f'{fn.__name__}:', datetime.now() - start)
    
    
    time(is_even_modulo)
    time(is_even_and)
    

    Gives this result:

    $ python3 -m odd
    is_even_modulo: 0:00:14.347631
    is_even_and: 0:00:17.476522
    $ python3 --version
    Python 3.6.1
    

    As suggested in other answers, the function calls is a large overhead, however, removing it shows that modulo is still faster than bitwise and in Python 3.6.1:

    # odd.py
    from datetime import datetime
    
    iterations = 100_000_000
    
    
    def time_and():
        start = datetime.now()
        for i in range(iterations):
            i & 1 
        print('&:', datetime.now() - start)
    
    
    def time_modulo():
        start = datetime.now()
        for i in range(iterations):
            i % 2
        print('%:', datetime.now() - start)
    
    
    time_modulo()
    time_and()
    

    Results:

    $ python3 -m odd
    %: 0:00:05.134051
    &: 0:00:07.250571
    

    Bonus: it turns out this takes about double the time to run in Python 2.7.

    $ time python2 -m odd
    ('&:', '0:00:20.169402')
    ('%:', '0:00:19.837755')
    
    real    0m41.198s
    user    0m39.091s
    sys 0m1.899s
    $ time python3 -m odd
    &: 0:00:11.375059
    %: 0:00:08.010738
    
    real    0m19.452s
    user    0m19.354s
    sys 0m0.042s
    

提交回复
热议问题