From 6aaf0a2c77b671f3e35e71dfccc569f51d8e3b00 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Tue, 8 Nov 2022 12:49:47 +0100 Subject: [PATCH] maths/number_of_digits.py: Streamline benchmarks (#7913) * maths/number_of_digits.py: Streamline benchmarks ``` num_digits(262144): 6 -- 0.2226011250168085 seconds num_digits_fast(262144): 6 -- 0.13145116699161008 seconds num_digits_faster(262144): 6 -- 0.09273383300751448 seconds num_digits(1125899906842624): 16 -- 0.6056742920191027 seconds num_digits_fast(1125899906842624): 16 -- 0.15698366600554436 seconds num_digits_faster(1125899906842624): 16 -- 0.1027024170034565 seconds num_digits(1267650600228229401496703205376): 31 -- 1.1957934170495719 seconds num_digits_fast(1267650600228229401496703205376): 31 -- 0.15552304196171463 seconds num_digits_faster(1267650600228229401496703205376): 31 -- 0.13062308297958225 seconds ``` * updating DIRECTORY.md * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update number_of_digits.py Co-authored-by: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- maths/number_of_digits.py | 92 +++++---------------------------------- 1 file changed, 11 insertions(+), 81 deletions(-) diff --git a/maths/number_of_digits.py b/maths/number_of_digits.py index 3c0eb7b38..86bc67f72 100644 --- a/maths/number_of_digits.py +++ b/maths/number_of_digits.py @@ -67,93 +67,23 @@ def num_digits_faster(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( - "> num_digits()", - "\t\tans =", - num_digits(small_num), - "\ttime =", - timeit("z.num_digits(z.small_num)", setup="import __main__ as z"), - "seconds", - ) - print( - "> num_digits_fast()", - "\tans =", - num_digits_fast(small_num), - "\ttime =", - timeit("z.num_digits_fast(z.small_num)", setup="import __main__ as z"), - "seconds", - ) - print( - "> num_digits_faster()", - "\tans =", - num_digits_faster(small_num), - "\ttime =", - timeit("z.num_digits_faster(z.small_num)", setup="import __main__ as z"), - "seconds", - ) + from collections.abc import Callable - print("\nFor medium_num = ", medium_num, ":") - print( - "> num_digits()", - "\t\tans =", - num_digits(medium_num), - "\ttime =", - timeit("z.num_digits(z.medium_num)", setup="import __main__ as z"), - "seconds", - ) - print( - "> num_digits_fast()", - "\tans =", - num_digits_fast(medium_num), - "\ttime =", - timeit("z.num_digits_fast(z.medium_num)", setup="import __main__ as z"), - "seconds", - ) - print( - "> num_digits_faster()", - "\tans =", - num_digits_faster(medium_num), - "\ttime =", - timeit("z.num_digits_faster(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}: {func(value)} -- {timing} seconds") - print("\nFor large_num = ", large_num, ":") - print( - "> num_digits()", - "\t\tans =", - num_digits(large_num), - "\ttime =", - timeit("z.num_digits(z.large_num)", setup="import __main__ as z"), - "seconds", - ) - print( - "> num_digits_fast()", - "\tans =", - num_digits_fast(large_num), - "\ttime =", - timeit("z.num_digits_fast(z.large_num)", setup="import __main__ as z"), - "seconds", - ) - print( - "> num_digits_faster()", - "\tans =", - num_digits_faster(large_num), - "\ttime =", - timeit("z.num_digits_faster(z.large_num)", setup="import __main__ as z"), - "seconds", - ) + for value in (262144, 1125899906842624, 1267650600228229401496703205376): + for func in (num_digits, num_digits_fast, num_digits_faster): + benchmark_a_function(func, value) + print() if __name__ == "__main__": - small_num = 262144 - medium_num = 1125899906842624 - large_num = 1267650600228229401496703205376 - benchmark() import doctest doctest.testmod() + benchmark()