Quersumme Performance
Verfasst: Mittwoch 26. Januar 2022, 00:17
Welcher Algorithmus ist performanter, um die Quersumme einer Zahl zu bilden?
Anders als bei der Ursprungsidee geht es hier nur darum die tatsächliche Quersumme einer Zahl zu bilden.
Nach dem Motto: Trau keiner Statistik die du nicht selbst gefälscht hast: Man muss die Anzahl der Ziffern nur genügend groß werden lassen um den bevorzugten Algorithmus gewinnen zu lassen.
Eigentlich ist der Unterschied aber sowieso nicht so gravierend.
testcode:
Beginnend mit einer einstelligen Zahl, werden für immer länger werdende Zahlen, werden wiederholt die Quersummen berechnet.
Anders als bei der Ursprungsidee geht es hier nur darum die tatsächliche Quersumme einer Zahl zu bilden.
Nach dem Motto: Trau keiner Statistik die du nicht selbst gefälscht hast: Man muss die Anzahl der Ziffern nur genügend groß werden lassen um den bevorzugten Algorithmus gewinnen zu lassen.
Eigentlich ist der Unterschied aber sowieso nicht so gravierend.
testcode:
Beginnend mit einer einstelligen Zahl, werden für immer länger werdende Zahlen, werden wiederholt die Quersummen berechnet.
Code: Alles auswählen
import random
import string
import matplotlib.pyplot as plt
ITERATIONS = 10000
MAX_DIGITS = 40
def crosssum(number):
return sum(map(int, str(number)))
def checksum(number):
result = 0
while number:
number, remain = divmod(number, 10)
result += remain
return result
def generate_digits(length):
test_digits = ""
for _ in range(length):
test_digits += random.choice(string.digits)
yield int(test_digits)
def main():
import timeit
fig, ax = plt.subplots()
ax.set_title(f"Testrun with {ITERATIONS} iterations and\na growing number of up to {MAX_DIGITS} digits")
ax.set_xlabel("digits in number")
ax.set_ylabel("time")
ax.grid()
for test_func in ["crosssum", "checksum"]:
time_data = [
timeit.timeit(f"{test_func}({test_number})", setup=f"from __main__ import {test_func}", number=ITERATIONS)
for test_number in generate_digits(MAX_DIGITS)
]
ax.plot(time_data, label=test_func)
ax.legend()
plt.show()
if __name__ == "__main__":
main()