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
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