maths/sum_of_digits.py: Streamline benchmarks (#7914)

* maths/sum_of_digits.py: Streamline benchmarks

```
sum_of_digits(262144): 19 -- 0.3128329170285724 seconds
sum_of_digits_recursion(262144): 19 -- 0.34008108399575576 seconds
sum_of_digits_compact(262144): 19 -- 0.6086010000435635 seconds

sum_of_digits(1125899906842624): 76 -- 0.8079068749793805 seconds
sum_of_digits_recursion(1125899906842624): 76 -- 0.8435653329943307 seconds
sum_of_digits_compact(1125899906842624): 76 -- 1.247976207989268 seconds

sum_of_digits(1267650600228229401496703205376): 115 -- 1.6441589999594726 seconds
sum_of_digits_recursion(1267650600228229401496703205376): 115 -- 1.713684624992311 seconds
sum_of_digits_compact(1267650600228229401496703205376): 115 -- 2.2197747920290567 seconds
```

* updating DIRECTORY.md

* Update sum_of_digits.py

* Update sum_of_digits.py

Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com>
This commit is contained in:
Christian Clauss 2022-11-01 14:07:11 +01:00 committed by GitHub
parent 7d139ee7f1
commit d23e709aea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,10 +1,6 @@
from timeit import timeit
def sum_of_digits(n: int) -> int:
"""
Find the sum of digits of a number.
>>> sum_of_digits(12345)
15
>>> sum_of_digits(123)
@ -25,7 +21,6 @@ def sum_of_digits(n: int) -> int:
def sum_of_digits_recursion(n: int) -> int:
"""
Find the sum of digits of a number using recursion
>>> sum_of_digits_recursion(12345)
15
>>> sum_of_digits_recursion(123)
@ -42,7 +37,6 @@ def sum_of_digits_recursion(n: int) -> int:
def sum_of_digits_compact(n: int) -> int:
"""
Find the sum of digits of a number
>>> sum_of_digits_compact(12345)
15
>>> sum_of_digits_compact(123)
@ -57,93 +51,24 @@ def sum_of_digits_compact(n: int) -> int:
def benchmark() -> None:
"""
Benchmark code for comparing 3 functions,
with 3 different length int values.
Benchmark multiple functions, with three different length int values.
"""
print("\nFor small_num = ", small_num, ":")
print(
"> sum_of_digits()",
"\t\tans =",
sum_of_digits(small_num),
"\ttime =",
timeit("z.sum_of_digits(z.small_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_recursion()",
"\tans =",
sum_of_digits_recursion(small_num),
"\ttime =",
timeit("z.sum_of_digits_recursion(z.small_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_compact()",
"\tans =",
sum_of_digits_compact(small_num),
"\ttime =",
timeit("z.sum_of_digits_compact(z.small_num)", setup="import __main__ as z"),
"seconds",
)
from collections.abc import Callable
from timeit import timeit
print("\nFor medium_num = ", medium_num, ":")
print(
"> sum_of_digits()",
"\t\tans =",
sum_of_digits(medium_num),
"\ttime =",
timeit("z.sum_of_digits(z.medium_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_recursion()",
"\tans =",
sum_of_digits_recursion(medium_num),
"\ttime =",
timeit("z.sum_of_digits_recursion(z.medium_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_compact()",
"\tans =",
sum_of_digits_compact(medium_num),
"\ttime =",
timeit("z.sum_of_digits_compact(z.medium_num)", setup="import __main__ as z"),
"seconds",
)
def benchmark_a_function(func: Callable, value: int) -> None:
call = f"{func.__name__}({value})"
timing = timeit(f"__main__.{call}", setup="import __main__")
print(f"{call:56} = {func(value)} -- {timing:.4f} seconds")
print("\nFor large_num = ", large_num, ":")
print(
"> sum_of_digits()",
"\t\tans =",
sum_of_digits(large_num),
"\ttime =",
timeit("z.sum_of_digits(z.large_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_recursion()",
"\tans =",
sum_of_digits_recursion(large_num),
"\ttime =",
timeit("z.sum_of_digits_recursion(z.large_num)", setup="import __main__ as z"),
"seconds",
)
print(
"> sum_of_digits_compact()",
"\tans =",
sum_of_digits_compact(large_num),
"\ttime =",
timeit("z.sum_of_digits_compact(z.large_num)", setup="import __main__ as z"),
"seconds",
)
for value in (262144, 1125899906842624, 1267650600228229401496703205376):
for func in (sum_of_digits, sum_of_digits_recursion, sum_of_digits_compact):
benchmark_a_function(func, value)
print()
if __name__ == "__main__":
small_num = 262144
medium_num = 1125899906842624
large_num = 1267650600228229401496703205376
benchmark()
import doctest
doctest.testmod()
benchmark()