1+ import math
2+ from timeit import timeit
3+
4+
15def num_digits (n : int ) -> int :
26 """
37 Find the number of digits in a number.
@@ -14,5 +18,82 @@ def num_digits(n: int) -> int:
1418 return digits
1519
1620
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+
1795if __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