1
- from timeit import timeit
2
-
3
-
4
1
def sum_of_digits (n : int ) -> int :
5
2
"""
6
3
Find the sum of digits of a number.
7
-
8
4
>>> sum_of_digits(12345)
9
5
15
10
6
>>> sum_of_digits(123)
@@ -25,7 +21,6 @@ def sum_of_digits(n: int) -> int:
25
21
def sum_of_digits_recursion (n : int ) -> int :
26
22
"""
27
23
Find the sum of digits of a number using recursion
28
-
29
24
>>> sum_of_digits_recursion(12345)
30
25
15
31
26
>>> sum_of_digits_recursion(123)
@@ -42,7 +37,6 @@ def sum_of_digits_recursion(n: int) -> int:
42
37
def sum_of_digits_compact (n : int ) -> int :
43
38
"""
44
39
Find the sum of digits of a number
45
-
46
40
>>> sum_of_digits_compact(12345)
47
41
15
48
42
>>> sum_of_digits_compact(123)
@@ -57,93 +51,24 @@ def sum_of_digits_compact(n: int) -> int:
57
51
58
52
def benchmark () -> None :
59
53
"""
60
- Benchmark code for comparing 3 functions,
61
- with 3 different length int values.
54
+ Benchmark multiple functions, with three different length int values.
62
55
"""
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
88
58
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" )
114
63
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 ()
140
68
141
69
142
70
if __name__ == "__main__" :
143
- small_num = 262144
144
- medium_num = 1125899906842624
145
- large_num = 1267650600228229401496703205376
146
- benchmark ()
147
71
import doctest
148
72
149
73
doctest .testmod ()
74
+ benchmark ()
0 commit comments