Last active
September 15, 2015 10:52
-
-
Save carlos-jenkins/ad146bee29cc46c34ef5 to your computer and use it in GitHub Desktop.
Using timeit
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ 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