1
+ import math
2
+ from timeit import timeit
3
+
4
+
1
5
def num_digits (n : int ) -> int :
2
6
"""
3
7
Find the number of digits in a number.
@@ -14,5 +18,82 @@ def num_digits(n: int) -> int:
14
18
return digits
15
19
16
20
21
+ def num_digits_fast (n : int ) -> int :
22
+ """
23
+ Find the number of digits in a number.
24
+ abs() is used as logarithm for negative numbers is not defined.
25
+
26
+ >>> num_digits_fast(12345)
27
+ 5
28
+ >>> num_digits_fast(123)
29
+ 3
30
+ """
31
+ return (math .floor (math .log (abs (n ), 10 ) + 1 ))
32
+
33
+
34
+ def num_digits_faster (n : int ) -> int :
35
+ """
36
+ Find the number of digits in a number.
37
+ abs() is used for negative numbers
38
+
39
+ >>> num_digits_faster(12345)
40
+ 5
41
+ >>> num_digits_faster(123)
42
+ 3
43
+ """
44
+ return (len (str (abs (n ))))
45
+
46
+
47
+ def benchmark () -> None :
48
+ """
49
+ Benchmark code for comparing 3 functions,
50
+ with 3 different length int values.
51
+ """
52
+ print ('\n For small_num = ' , small_num , ':' )
53
+ print ("> num_digits()" ,
54
+ '\t \t ans =' , num_digits (small_num ),
55
+ '\t time =' , timeit ("z.num_digits(z.small_num)" ,
56
+ setup = "import __main__ as z" ), "seconds" )
57
+ print ("> num_digits_fast()" ,
58
+ '\t ans =' , num_digits_fast (small_num ),
59
+ '\t time =' , timeit ("z.num_digits_fast(z.small_num)" ,
60
+ setup = "import __main__ as z" ), "seconds" )
61
+ print ("> num_digits_faster()" ,
62
+ '\t ans =' , num_digits_faster (small_num ),
63
+ '\t time =' , timeit ("z.num_digits_faster(z.small_num)" ,
64
+ setup = "import __main__ as z" ), "seconds" )
65
+
66
+ print ('\n For medium_num = ' , medium_num , ':' )
67
+ print ("> num_digits()" ,
68
+ '\t \t ans =' , num_digits (medium_num ),
69
+ '\t time =' , timeit ("z.num_digits(z.medium_num)" ,
70
+ setup = "import __main__ as z" ), "seconds" )
71
+ print ("> num_digits_fast()" ,
72
+ '\t ans =' , num_digits_fast (medium_num ),
73
+ '\t time =' , timeit ("z.num_digits_fast(z.medium_num)" ,
74
+ setup = "import __main__ as z" ), "seconds" )
75
+ print ("> num_digits_faster()" ,
76
+ '\t ans =' , num_digits_faster (medium_num ),
77
+ '\t time =' , timeit ("z.num_digits_faster(z.medium_num)" ,
78
+ setup = "import __main__ as z" ), "seconds" )
79
+
80
+ print ('\n For large_num = ' , large_num , ':' )
81
+ print ("> num_digits()" ,
82
+ '\t \t ans =' , num_digits (large_num ),
83
+ '\t time =' , timeit ("z.num_digits(z.large_num)" ,
84
+ setup = "import __main__ as z" ), "seconds" )
85
+ print ("> num_digits_fast()" ,
86
+ '\t ans =' , num_digits_fast (large_num ),
87
+ '\t time =' , timeit ("z.num_digits_fast(z.large_num)" ,
88
+ setup = "import __main__ as z" ), "seconds" )
89
+ print ("> num_digits_faster()" ,
90
+ '\t ans =' , num_digits_faster (large_num ),
91
+ '\t time =' , timeit ("z.num_digits_faster(z.large_num)" ,
92
+ setup = "import __main__ as z" ), "seconds" )
93
+
94
+
17
95
if __name__ == "__main__" :
18
- print (num_digits (12345 )) # ===> 5
96
+ small_num = 262144
97
+ medium_num = 1125899906842624
98
+ large_num = 1267650600228229401496703205376
99
+ benchmark ()
0 commit comments