From 09d334a1865d56cdf3a13e2865e7f4d3602b908f Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Mon, 31 Oct 2022 16:03:12 +0100 Subject: [PATCH 1/4] 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 ``` --- maths/sum_of_digits.py | 99 +++++------------------------------------- 1 file changed, 12 insertions(+), 87 deletions(-) diff --git a/maths/sum_of_digits.py b/maths/sum_of_digits.py index 5ad5fe6c9877..a8853661a310 100644 --- a/maths/sum_of_digits.py +++ b/maths/sum_of_digits.py @@ -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"z.{call}", setup="import __main__ as z") + print(f"{call}: {func(value)} -- {timing} 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() From 76806e56ba1845c701676a2dd892ea599be46db9 Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Mon, 31 Oct 2022 15:03:41 +0000 Subject: [PATCH 2/4] updating DIRECTORY.md --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 0b0d1e6a7c9d..98a6be2607f4 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -238,6 +238,7 @@ * [Stack With Singly Linked List](data_structures/stacks/stack_with_singly_linked_list.py) * [Stock Span Problem](data_structures/stacks/stock_span_problem.py) * Trie + * [Radix Tree](data_structures/trie/radix_tree.py) * [Trie](data_structures/trie/trie.py) ## Digital Image Processing From 91b227247b912001f87d4506b193f34b438202a9 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Mon, 31 Oct 2022 16:18:51 +0100 Subject: [PATCH 3/4] Update sum_of_digits.py --- maths/sum_of_digits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/sum_of_digits.py b/maths/sum_of_digits.py index a8853661a310..d3a3cef5ef65 100644 --- a/maths/sum_of_digits.py +++ b/maths/sum_of_digits.py @@ -58,7 +58,7 @@ def benchmark() -> None: def benchmark_a_function(func: Callable, value: int) -> None: call = f"{func.__name__}({value})" - timing = timeit(f"z.{call}", setup="import __main__ as z") + timing = timeit(f"__main__.{call}", setup="import __main__") print(f"{call}: {func(value)} -- {timing} seconds") for value in (262144, 1125899906842624, 1267650600228229401496703205376): From 43ec6552b3786cdfbe405f71598591bb6f28a299 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Mon, 31 Oct 2022 16:30:36 +0100 Subject: [PATCH 4/4] Update sum_of_digits.py --- maths/sum_of_digits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maths/sum_of_digits.py b/maths/sum_of_digits.py index d3a3cef5ef65..d5488bb9e9e0 100644 --- a/maths/sum_of_digits.py +++ b/maths/sum_of_digits.py @@ -59,7 +59,7 @@ def benchmark() -> None: 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(f"{call:56} = {func(value)} -- {timing:.4f} seconds") for value in (262144, 1125899906842624, 1267650600228229401496703205376): for func in (sum_of_digits, sum_of_digits_recursion, sum_of_digits_compact):