Je travaille sur un problème de programmation où je dois gérer un nombre de 100000 chiffres. Python peut-il gérer des nombres comme celui-ci?Gestion des grands nombres dans le code
Répondre
Bien sûr, il peut:
>>> s = 10 ** 100000
Il semble bien fonctionner:
>>> x = 10**100000
>>> x
10000000000000000000000000000000000000000000000000000000000000000000000000000000
[snip]
00000000L
Selon http://docs.python.org/library/stdtypes.html, « Les entiers longs ont une précision illimitée », ce qui signifie sans doute que leur taille n'est pas limitée.
Oui; Python 2.x a deux types d'entiers, int de taille limitée et long de taille illimitée. Cependant, tous les calculs seront automatiquement convertis en longs si nécessaire. La gestion des grands nombres fonctionne bien, mais l'une des choses les plus lentes sera si vous essayez d'imprimer les 100000 chiffres à la sortie, ou même essayez de créer une chaîne à partir de cela.
Si vous avez également besoin d'une précision en virgule fixe décimale arbitraire, il existe le module décimal.
Comme d'autres réponses l'indiquent, Python ne supporte les nombres entiers limités que par la quantité de mémoire disponible. Si vous voulez un soutien encore plus rapide pour eux, essayer gmpy (comme auteur et co-mainteneur de gmpy Je suis bien sûr un peu biaisé ici ;-):
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x+1'
10000 loops, best of 3: 114 usec per loop
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y+1'
10000 loops, best of 3: 65.4 usec per loop
En règle générale, l'arithmétique n'est pas le goulot d'étranglement pour travailler avec ces nombres (bien que le support direct de gmpy
pour certaines fonctions combinatoires et théoriques des nombres peut aider si c'est ce que vous faites avec de tels nombres). En tournant les nombres en chaînes décimales est probablement l'opération commune qui se sentent le plus lent ...:
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(x)'
10 loops, best of 3: 3.11 sec per loop
$ python -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'str(y)'
10 loops, best of 3: 27.3 msec per loop
Comme vous le voyez, même dans gmpy
des nombres énormes mise en chaîne peut être des centaines de fois plus lent qu'une simple addition (hélas, c'est une opération intrinsèquement compliquée!); mais en code Python natif, le rapport des temps peut aller à la stringification étant des dizaines de milliers fois plus lent qu'une simple addition, donc vous voulez vraiment faire attention à cela, surtout si vous décidez de ne pas télécharger et installer gmpy
(par exemple parce que vous ne pouvez pas: par exemple, gmpy n'est actuellement pas compatible avec Google App Engine).
Enfin, un cas intermédiaire:
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'x*x'
10 loops, best of 3: 90 msec per loop
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*y'
100 loops, best of 3: 5.63 msec per loop
$ python2.6 -mtimeit -s'import gmpy; x=10**100000; y=gmpy.mpz(x)' 'y*x'
100 loops, best of 3: 8.4 msec per loop
Comme vous le voyez, la multiplication de deux nombres énormes dans le code Python natif peut être presque 1000 fois plus lent que la simple addition, tandis qu'avec gmpy
le ralentissement est inférieure à 100 fois (et ce n'est pas trop mal, même s'il n'y en a qu'un si les nombres sont déjà dans le format propre de gmpy
, de sorte qu'il y a le coût de la conversion de l'autre).
Merci pour gmpy! Je l'utilise pour un cours de crypto sur Coursera. –
GMPY2 prend en charge la bibliothèque GMP pour l'arithmétique entière et rationnelle, mais GMPY2 ajoute la prise en charge de l'arithmétique réelle et complexe à précision multiple fournie par les bibliothèques MPFR et MPC. GMP (bibliothèque arithmétique à précision multiple GNU) a pour objectif d'être plus rapide que toute autre bibliothèque bignum pour toutes les tailles d'opérandes. http://fr.wikipedia.org/wiki/GNU_Multiple_Precision_Arithmetic_Library –
Comme déjà souligné, Python peut gérer des nombres aussi grands que votre mémoire le permet. Je voudrais juste ajouter que plus les chiffres augmentent, plus le coût de toutes les opérations augmente. Ce n'est pas seulement pour l'impression/conversion en chaîne (bien que ce soit le plus lent), en ajoutant deux grands nombres (plus gros que ce que votre matériel peut gérer nativement) n'est plus O (1).Je ne fais que mentionner ceci pour signaler que bien que Python dissimule soigneusement les détails de travailler avec de grands nombres, vous devez toujours garder à l'esprit que ces opérations de grand nombre ne sont pas toujours comme celles sur des ints ordinaires.
- 1. Gestion de grands nombres en C++?
- 2. Générer des nombres premiers VRAIMENT grands
- 3. Types pour les grands nombres
- 4. Comment gérez-vous des nombres plus grands que UInt64 (C#)
- 5. Calcul de très grands nombres entiers
- 6. Comment convertir de grands nombres en décimales?
- 7. Comment gérer les grands nombres entiers (64 bits) dans tcl?
- 8. Comment trouver un^b de très grands nombres en python?
- 9. Gestion des événements VB.NET dans le code VB6
- 10. Gestion des délégués gérés dans le code non managé
- 11. Comment éviter la notation scientifique pour les grands nombres?
- 12. Quelle est la meilleure façon de représenter arbitrairement de grands nombres dans c?
- 13. Formatage des nombres dans Scala?
- 14. Réutilisation du code dans la gestion des exceptions
- 15. Accélération des fonctions jQuery empty() ou replaceWith() lors de la gestion de grands éléments DOM
- 16. Figer le code dans SVN - Gestion de la construction
- 17. Gestion des erreurs dans le contrôle ReportViewer
- 18. affichant des nombres aléatoires
- 19. Gestion des exceptions/gestion des ressources dans Jersey JAX-RS
- 20. Comment concaténer des nombres et des chaînes pour formater des nombres dans T-SQL?
- 21. Quelle est l'étiquette appropriée pour gérer le code existant potentiellement réutilisable dans les grands projets?
- 22. somme des nombres formatés
- 23. Gestion des événements dans SPWebPartManager
- 24. Gestion des événements dans wxPython
- 25. De plus grands nombres entiers à moins de conversions de type non signés en C
- 26. La gestion de la mémoire .NET est-elle plus rapide dans le code managé que dans le code natif?
- 27. OU-multiplication sur les grands entiers
- 28. Quels sont les grands projets .NET avec code source?
- 29. Fractionner le code en plusieurs fichiers pour faciliter la gestion
- 30. gestion des erreurs dans php
Très similaire: http://stackoverflow.com/questions/538551/handling-very-large-numbers-in-python –
En fonction de ce que vous faites avec ces chiffres, vous pourriez envisager de les stocker en tant que log (nombre). – mpen