1- from timeit import timeit
2-
3-
41def sum_of_digits (n : int ) -> int :
52 """
63 Find the sum of digits of a number.
7-
84 >>> sum_of_digits(12345)
95 15
106 >>> sum_of_digits(123)
@@ -25,7 +21,6 @@ def sum_of_digits(n: int) -> int:
2521def sum_of_digits_recursion (n : int ) -> int :
2622 """
2723 Find the sum of digits of a number using recursion
28-
2924 >>> sum_of_digits_recursion(12345)
3025 15
3126 >>> sum_of_digits_recursion(123)
@@ -42,7 +37,6 @@ def sum_of_digits_recursion(n: int) -> int:
4237def sum_of_digits_compact (n : int ) -> int :
4338 """
4439 Find the sum of digits of a number
45-
4640 >>> sum_of_digits_compact(12345)
4741 15
4842 >>> sum_of_digits_compact(123)
@@ -57,93 +51,24 @@ def sum_of_digits_compact(n: int) -> int:
5751
5852def benchmark () -> None :
5953 """
60- Benchmark code for comparing 3 functions,
61- with 3 different length int values.
54+ Benchmark multiple functions, with three different length int values.
6255 """
63- print ("\n For small_num = " , small_num , ":" )
64- print (
65- "> sum_of_digits()" ,
66- "\t \t ans =" ,
67- sum_of_digits (small_num ),
68- "\t time =" ,
69- timeit ("z.sum_of_digits(z.small_num)" , setup = "import __main__ as z" ),
70- "seconds" ,
71- )
72- print (
73- "> sum_of_digits_recursion()" ,
74- "\t ans =" ,
75- sum_of_digits_recursion (small_num ),
76- "\t time =" ,
77- timeit ("z.sum_of_digits_recursion(z.small_num)" , setup = "import __main__ as z" ),
78- "seconds" ,
79- )
80- print (
81- "> sum_of_digits_compact()" ,
82- "\t ans =" ,
83- sum_of_digits_compact (small_num ),
84- "\t time =" ,
85- timeit ("z.sum_of_digits_compact(z.small_num)" , setup = "import __main__ as z" ),
86- "seconds" ,
87- )
56+ from collections .abc import Callable
57+ from timeit import timeit
8858
89- print ("\n For medium_num = " , medium_num , ":" )
90- print (
91- "> sum_of_digits()" ,
92- "\t \t ans =" ,
93- sum_of_digits (medium_num ),
94- "\t time =" ,
95- timeit ("z.sum_of_digits(z.medium_num)" , setup = "import __main__ as z" ),
96- "seconds" ,
97- )
98- print (
99- "> sum_of_digits_recursion()" ,
100- "\t ans =" ,
101- sum_of_digits_recursion (medium_num ),
102- "\t time =" ,
103- timeit ("z.sum_of_digits_recursion(z.medium_num)" , setup = "import __main__ as z" ),
104- "seconds" ,
105- )
106- print (
107- "> sum_of_digits_compact()" ,
108- "\t ans =" ,
109- sum_of_digits_compact (medium_num ),
110- "\t time =" ,
111- timeit ("z.sum_of_digits_compact(z.medium_num)" , setup = "import __main__ as z" ),
112- "seconds" ,
113- )
59+ def benchmark_a_function (func : Callable , value : int ) -> None :
60+ call = f"{ func .__name__ } ({ value } )"
61+ timing = timeit (f"__main__.{ call } " , setup = "import __main__" )
62+ print (f"{ call :56} = { func (value )} -- { timing :.4f} seconds" )
11463
115- print ("\n For large_num = " , large_num , ":" )
116- print (
117- "> sum_of_digits()" ,
118- "\t \t ans =" ,
119- sum_of_digits (large_num ),
120- "\t time =" ,
121- timeit ("z.sum_of_digits(z.large_num)" , setup = "import __main__ as z" ),
122- "seconds" ,
123- )
124- print (
125- "> sum_of_digits_recursion()" ,
126- "\t ans =" ,
127- sum_of_digits_recursion (large_num ),
128- "\t time =" ,
129- timeit ("z.sum_of_digits_recursion(z.large_num)" , setup = "import __main__ as z" ),
130- "seconds" ,
131- )
132- print (
133- "> sum_of_digits_compact()" ,
134- "\t ans =" ,
135- sum_of_digits_compact (large_num ),
136- "\t time =" ,
137- timeit ("z.sum_of_digits_compact(z.large_num)" , setup = "import __main__ as z" ),
138- "seconds" ,
139- )
64+ for value in (262144 , 1125899906842624 , 1267650600228229401496703205376 ):
65+ for func in (sum_of_digits , sum_of_digits_recursion , sum_of_digits_compact ):
66+ benchmark_a_function (func , value )
67+ print ()
14068
14169
14270if __name__ == "__main__" :
143- small_num = 262144
144- medium_num = 1125899906842624
145- large_num = 1267650600228229401496703205376
146- benchmark ()
14771 import doctest
14872
14973 doctest .testmod ()
74+ benchmark ()
0 commit comments