mirror of
https://hub.njuu.cf/TheAlgorithms/Python.git
synced 2023-10-11 13:06:12 +08:00
Update count_number_of_one_bits.py (#7589)
* Update count_number_of_one_bits.py removed the modulo operator as it is very time consuming in comparison to the and operator * Update count_number_of_one_bits.py Updated with the timeit library to compare. Moreover I have updated my code which helps us in reaching the output comparatively faster. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update bit_manipulation/count_number_of_one_bits.py Co-authored-by: Christian Clauss <cclauss@me.com> * Update count_number_of_one_bits.py Updated the code * Update count_number_of_one_bits.py Updated code * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Run the tests before running the benchmarks * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * consistently Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
parent
bd490614a6
commit
bb078541dd
@ -1,34 +1,91 @@
|
|||||||
def get_set_bits_count(number: int) -> int:
|
from timeit import timeit
|
||||||
|
|
||||||
|
|
||||||
|
def get_set_bits_count_using_brian_kernighans_algorithm(number: int) -> int:
|
||||||
"""
|
"""
|
||||||
Count the number of set bits in a 32 bit integer
|
Count the number of set bits in a 32 bit integer
|
||||||
>>> get_set_bits_count(25)
|
>>> get_set_bits_count_using_brian_kernighans_algorithm(25)
|
||||||
3
|
3
|
||||||
>>> get_set_bits_count(37)
|
>>> get_set_bits_count_using_brian_kernighans_algorithm(37)
|
||||||
3
|
3
|
||||||
>>> get_set_bits_count(21)
|
>>> get_set_bits_count_using_brian_kernighans_algorithm(21)
|
||||||
3
|
3
|
||||||
>>> get_set_bits_count(58)
|
>>> get_set_bits_count_using_brian_kernighans_algorithm(58)
|
||||||
4
|
4
|
||||||
>>> get_set_bits_count(0)
|
>>> get_set_bits_count_using_brian_kernighans_algorithm(0)
|
||||||
0
|
0
|
||||||
>>> get_set_bits_count(256)
|
>>> get_set_bits_count_using_brian_kernighans_algorithm(256)
|
||||||
1
|
1
|
||||||
>>> get_set_bits_count(-1)
|
>>> get_set_bits_count_using_brian_kernighans_algorithm(-1)
|
||||||
Traceback (most recent call last):
|
Traceback (most recent call last):
|
||||||
...
|
...
|
||||||
ValueError: the value of input must be positive
|
ValueError: the value of input must not be negative
|
||||||
"""
|
"""
|
||||||
if number < 0:
|
if number < 0:
|
||||||
raise ValueError("the value of input must be positive")
|
raise ValueError("the value of input must not be negative")
|
||||||
|
result = 0
|
||||||
|
while number:
|
||||||
|
number &= number - 1
|
||||||
|
result += 1
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def get_set_bits_count_using_modulo_operator(number: int) -> int:
|
||||||
|
"""
|
||||||
|
Count the number of set bits in a 32 bit integer
|
||||||
|
>>> get_set_bits_count_using_modulo_operator(25)
|
||||||
|
3
|
||||||
|
>>> get_set_bits_count_using_modulo_operator(37)
|
||||||
|
3
|
||||||
|
>>> get_set_bits_count_using_modulo_operator(21)
|
||||||
|
3
|
||||||
|
>>> get_set_bits_count_using_modulo_operator(58)
|
||||||
|
4
|
||||||
|
>>> get_set_bits_count_using_modulo_operator(0)
|
||||||
|
0
|
||||||
|
>>> get_set_bits_count_using_modulo_operator(256)
|
||||||
|
1
|
||||||
|
>>> get_set_bits_count_using_modulo_operator(-1)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
...
|
||||||
|
ValueError: the value of input must not be negative
|
||||||
|
"""
|
||||||
|
if number < 0:
|
||||||
|
raise ValueError("the value of input must not be negative")
|
||||||
result = 0
|
result = 0
|
||||||
while number:
|
while number:
|
||||||
if number % 2 == 1:
|
if number % 2 == 1:
|
||||||
result += 1
|
result += 1
|
||||||
number = number >> 1
|
number >>= 1
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
def benchmark() -> None:
|
||||||
|
"""
|
||||||
|
Benchmark code for comparing 2 functions, with different length int values.
|
||||||
|
Brian Kernighan's algorithm is consistently faster than using modulo_operator.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def do_benchmark(number: int) -> None:
|
||||||
|
setup = "import __main__ as z"
|
||||||
|
print(f"Benchmark when {number = }:")
|
||||||
|
print(f"{get_set_bits_count_using_modulo_operator(number) = }")
|
||||||
|
timing = timeit("z.get_set_bits_count_using_modulo_operator(25)", setup=setup)
|
||||||
|
print(f"timeit() runs in {timing} seconds")
|
||||||
|
print(f"{get_set_bits_count_using_brian_kernighans_algorithm(number) = }")
|
||||||
|
timing = timeit(
|
||||||
|
"z.get_set_bits_count_using_brian_kernighans_algorithm(25)",
|
||||||
|
setup=setup,
|
||||||
|
)
|
||||||
|
print(f"timeit() runs in {timing} seconds")
|
||||||
|
|
||||||
|
for number in (25, 37, 58, 0):
|
||||||
|
do_benchmark(number)
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import doctest
|
import doctest
|
||||||
|
|
||||||
doctest.testmod()
|
doctest.testmod()
|
||||||
|
benchmark()
|
||||||
|
Loading…
Reference in New Issue
Block a user