Le fait qu'il soit plus rapide de travailler avec des mathématiques ou des chaînes de caractères dépend ici de la taille du nombre d'entrée.
Pour les petits nombres, utilisez les mathématiques (division et modulus) :
def sum_digits_math(n):
r = 0
while n:
r, n = r + n % 10, n // 10
return r
Pour les grands nombres, utilisez le domaine de la chaîne de caractères :
def sum_digits_str_dumb(n):
"""from OP https://stackoverflow.com/q/14939953/674039"""
return sum(int(i) for i in str(n))
def sum_digits_str_fast(n):
d = str(n)
return sum(int(s) * d.count(s) for s in "123456789")
Le point d'intersection, où l'utilisation de la division et du module commence à perdre du terrain par rapport au travail dans le domaine des chaînes de caractères, se situe à des nombres d'environ 27 chiffres (là où la ligne bleue croise la ligne rouge dans le graphique ci-dessous) :
Le profil de performance pour l'utilisation des mathématiques se dégrade au fur et à mesure que le nombre d'entrée est plus grand, mais le domaine des chaînes de caractères semble évoluer linéairement en fonction de la longueur de l'entrée. Le code qui a été utilisé pour générer ces graphiques est le suivant aquí J'utilise CPython 3.10.2 sur macOS.