Skip to content

Instantly share code, notes, and snippets.

@carlos-jenkins
Last active September 15, 2015 10:52
Show Gist options
  • Save carlos-jenkins/ad146bee29cc46c34ef5 to your computer and use it in GitHub Desktop.
Save carlos-jenkins/ad146bee29cc46c34ef5 to your computer and use it in GitHub Desktop.
Using timeit
def add_digits_optimized(num):
"""
Recursively sum al digits of a number until result is one digit.
Optimized version using simple integer logic.
:param int num: Number to sum all it's digits.
:rtype: int
:return: The recusive sum of all digits.
"""
result = 0
while True:
while num:
result += num % 10
num = num // 10
if result < 10:
break
num = result
result = 0
return result
def add_digits(num):
"""
Ugly unoptimized version.
"""
list = [int(i) for i in str(num)]
while len(list) != 1:
sum = list[0] + list[1]
if len(str(sum)) == 1:
list[1] = sum
list.remove(list[0])
else:
list[0] = int(str(sum)[0])
list[1] = int(str(sum)[1])
return list[0]
if __name__ == '__main__':
# Assert that for the same input value the function
# remains functionally the same
for num in range(100):
original = add_digits(num)
optimized = add_digits_optimized(num)
print(
'add_digits({0}) -> {1:d}\t'
'add_digits_optimized({0}) -> {2:d}'.format(
num, original, optimized
)
)
assert original == optimized
# Calculate performance improvement
print('Running benchmark...')
def stress(func, num):
def binded():
for idx in range(num):
func(idx)
return binded
from timeit import repeat
pre_opt = min(
repeat(stress(add_digits, 1000), repeat=10, number=100)
)
post_opt = min(
repeat(stress(add_digits_optimized, 1000), repeat=10, number=100)
)
gain = ((pre_opt - post_opt) / pre_opt) * 100.0
print('Best execution time:')
print('Non optimized version: {}'.format(pre_opt))
print('Optimized version: {}'.format(post_opt))
print('Performance gain: -{:.2f}%'.format(gain))
exit(0)
$ python add_digits.py
add_digits(0) -> 0 add_digits_optimized(0) -> 0
add_digits(1) -> 1 add_digits_optimized(1) -> 1
add_digits(2) -> 2 add_digits_optimized(2) -> 2
add_digits(3) -> 3 add_digits_optimized(3) -> 3
add_digits(4) -> 4 add_digits_optimized(4) -> 4
add_digits(5) -> 5 add_digits_optimized(5) -> 5
add_digits(6) -> 6 add_digits_optimized(6) -> 6
add_digits(7) -> 7 add_digits_optimized(7) -> 7
add_digits(8) -> 8 add_digits_optimized(8) -> 8
add_digits(9) -> 9 add_digits_optimized(9) -> 9
add_digits(10) -> 1 add_digits_optimized(10) -> 1
add_digits(11) -> 2 add_digits_optimized(11) -> 2
add_digits(12) -> 3 add_digits_optimized(12) -> 3
add_digits(13) -> 4 add_digits_optimized(13) -> 4
add_digits(14) -> 5 add_digits_optimized(14) -> 5
add_digits(15) -> 6 add_digits_optimized(15) -> 6
add_digits(16) -> 7 add_digits_optimized(16) -> 7
add_digits(17) -> 8 add_digits_optimized(17) -> 8
add_digits(18) -> 9 add_digits_optimized(18) -> 9
add_digits(19) -> 1 add_digits_optimized(19) -> 1
add_digits(20) -> 2 add_digits_optimized(20) -> 2
add_digits(21) -> 3 add_digits_optimized(21) -> 3
add_digits(22) -> 4 add_digits_optimized(22) -> 4
add_digits(23) -> 5 add_digits_optimized(23) -> 5
add_digits(24) -> 6 add_digits_optimized(24) -> 6
add_digits(25) -> 7 add_digits_optimized(25) -> 7
add_digits(26) -> 8 add_digits_optimized(26) -> 8
add_digits(27) -> 9 add_digits_optimized(27) -> 9
add_digits(28) -> 1 add_digits_optimized(28) -> 1
add_digits(29) -> 2 add_digits_optimized(29) -> 2
add_digits(30) -> 3 add_digits_optimized(30) -> 3
add_digits(31) -> 4 add_digits_optimized(31) -> 4
add_digits(32) -> 5 add_digits_optimized(32) -> 5
add_digits(33) -> 6 add_digits_optimized(33) -> 6
add_digits(34) -> 7 add_digits_optimized(34) -> 7
add_digits(35) -> 8 add_digits_optimized(35) -> 8
add_digits(36) -> 9 add_digits_optimized(36) -> 9
add_digits(37) -> 1 add_digits_optimized(37) -> 1
add_digits(38) -> 2 add_digits_optimized(38) -> 2
add_digits(39) -> 3 add_digits_optimized(39) -> 3
add_digits(40) -> 4 add_digits_optimized(40) -> 4
add_digits(41) -> 5 add_digits_optimized(41) -> 5
add_digits(42) -> 6 add_digits_optimized(42) -> 6
add_digits(43) -> 7 add_digits_optimized(43) -> 7
add_digits(44) -> 8 add_digits_optimized(44) -> 8
add_digits(45) -> 9 add_digits_optimized(45) -> 9
add_digits(46) -> 1 add_digits_optimized(46) -> 1
add_digits(47) -> 2 add_digits_optimized(47) -> 2
add_digits(48) -> 3 add_digits_optimized(48) -> 3
add_digits(49) -> 4 add_digits_optimized(49) -> 4
add_digits(50) -> 5 add_digits_optimized(50) -> 5
add_digits(51) -> 6 add_digits_optimized(51) -> 6
add_digits(52) -> 7 add_digits_optimized(52) -> 7
add_digits(53) -> 8 add_digits_optimized(53) -> 8
add_digits(54) -> 9 add_digits_optimized(54) -> 9
add_digits(55) -> 1 add_digits_optimized(55) -> 1
add_digits(56) -> 2 add_digits_optimized(56) -> 2
add_digits(57) -> 3 add_digits_optimized(57) -> 3
add_digits(58) -> 4 add_digits_optimized(58) -> 4
add_digits(59) -> 5 add_digits_optimized(59) -> 5
add_digits(60) -> 6 add_digits_optimized(60) -> 6
add_digits(61) -> 7 add_digits_optimized(61) -> 7
add_digits(62) -> 8 add_digits_optimized(62) -> 8
add_digits(63) -> 9 add_digits_optimized(63) -> 9
add_digits(64) -> 1 add_digits_optimized(64) -> 1
add_digits(65) -> 2 add_digits_optimized(65) -> 2
add_digits(66) -> 3 add_digits_optimized(66) -> 3
add_digits(67) -> 4 add_digits_optimized(67) -> 4
add_digits(68) -> 5 add_digits_optimized(68) -> 5
add_digits(69) -> 6 add_digits_optimized(69) -> 6
add_digits(70) -> 7 add_digits_optimized(70) -> 7
add_digits(71) -> 8 add_digits_optimized(71) -> 8
add_digits(72) -> 9 add_digits_optimized(72) -> 9
add_digits(73) -> 1 add_digits_optimized(73) -> 1
add_digits(74) -> 2 add_digits_optimized(74) -> 2
add_digits(75) -> 3 add_digits_optimized(75) -> 3
add_digits(76) -> 4 add_digits_optimized(76) -> 4
add_digits(77) -> 5 add_digits_optimized(77) -> 5
add_digits(78) -> 6 add_digits_optimized(78) -> 6
add_digits(79) -> 7 add_digits_optimized(79) -> 7
add_digits(80) -> 8 add_digits_optimized(80) -> 8
add_digits(81) -> 9 add_digits_optimized(81) -> 9
add_digits(82) -> 1 add_digits_optimized(82) -> 1
add_digits(83) -> 2 add_digits_optimized(83) -> 2
add_digits(84) -> 3 add_digits_optimized(84) -> 3
add_digits(85) -> 4 add_digits_optimized(85) -> 4
add_digits(86) -> 5 add_digits_optimized(86) -> 5
add_digits(87) -> 6 add_digits_optimized(87) -> 6
add_digits(88) -> 7 add_digits_optimized(88) -> 7
add_digits(89) -> 8 add_digits_optimized(89) -> 8
add_digits(90) -> 9 add_digits_optimized(90) -> 9
add_digits(91) -> 1 add_digits_optimized(91) -> 1
add_digits(92) -> 2 add_digits_optimized(92) -> 2
add_digits(93) -> 3 add_digits_optimized(93) -> 3
add_digits(94) -> 4 add_digits_optimized(94) -> 4
add_digits(95) -> 5 add_digits_optimized(95) -> 5
add_digits(96) -> 6 add_digits_optimized(96) -> 6
add_digits(97) -> 7 add_digits_optimized(97) -> 7
add_digits(98) -> 8 add_digits_optimized(98) -> 8
add_digits(99) -> 9 add_digits_optimized(99) -> 9
Running benchmark...
Best execution time:
Non optimized version: 0.372886896133
Optimized version: 0.0686509609222
Performance gain: -81.59%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment