Python longue multiplication
Je suis dans le besoin d'un algorithme plus rapide que le courant normal Python longue multiplication.
J'ai essayé de trouver un travail décent Karatsuba mise en œuvre, mais je ne peux pas.
def main():
a=long(raw_input())
if(a<0):
a=a*-1
a=((a*(a+1)/2)-1)
print(-a)
else:
a=(a*(a+1))/2
print(a)
main()
Comme vous le voyez, rien de bien compliqué, juste un peu de multiplications. Mais il a à traiter des nombres jusqu'à 100000 chiffres en moins de 2,5 secondes.
J'aimerais avoir quelques extrait d'une fonction ou juste un lien pour certains la mise en œuvre d'une multiplication plus rapide de la fonction, ou tout ce qui vous aide.
Je pense que Python utilise déjà karatsuba sous le capot (lorsqu'il est déclenché par un grand nombre de chiffres)...
Python n'utilisez déjà karatsuba pour longue multiplication. L'impression prend plus de temps que la multiplication
Est-il ok pour
Avez-vous profilé de votre application? Êtes-vous sûr que la multiplication est goulot d'étranglement?
Oui , je suis sûr que la multiplication est le goulot d'étranglement parce que je dois l'imprimer en décimal , la seule chose qui reste est l'amélioration de la multiplication de la vitesse.
Python n'utilisez déjà karatsuba pour longue multiplication. L'impression prend plus de temps que la multiplication
Est-il ok pour
print(hex(a))
? Il sera beaucoup plus rapide que print(a)
Avez-vous profilé de votre application? Êtes-vous sûr que la multiplication est goulot d'étranglement?
Oui , je suis sûr que la multiplication est le goulot d'étranglement parce que je dois l'imprimer en décimal , la seule chose qui reste est l'amélioration de la multiplication de la vitesse.
OriginalL'auteur Nedim | 2009-12-02
Vous devez vous connecter pour publier un commentaire.
Vous pourriez avoir un coup d'oeil à la mise en œuvre de la DecInt module (pure version de Python est disponible (Toom-Cook), bien que le plus rapide, il sera probablement lors de l'utilisation de gmpy).
Si ces algorithmes sont plus rapides, pourquoi ne sont-ils pas mis en œuvre en python?
l'ensemble de la bibliothèque dans mon code"? "réduire la taille de sorte qu'il [quoi?] s'adapte à 64 ko"? "viola"? En effet, vous êtes sui generis 🙂
OriginalL'auteur ChristopheD
Je suis l'auteur de la DecInt (nombre Décimal) bibliothèque donc je vais faire quelques commentaires.
La DecInt de la bibliothèque a été spécifiquement conçu pour fonctionner avec de très grands nombres entiers qui doivent être convertis au format décimal. Le problème avec la conversion au format décimal est que la plupart précision arbitraire des bibliothèques de stocker des valeurs en binaire. C'est plus rapide et plus efficace de l'utilisation de la mémoire, mais la conversion de binaire en décimal est généralement lente. Python est du binaire à décimal de conversion utilise un O(n^2) algorithme et est au ralenti très rapidement.
DecInt utilise un grand décimal radix (généralement de 10^250) et stocke le très grand nombre de blocs de 250 chiffres. La conversion d'un très grand nombre de format décimal maintenant s'exécute en O(n).
Naïf, ou l'école primaire, la multiplication a un temps d'exécution de O(n^2). Python utilise la multiplication de Karatsuba qui a temps d'exécution de O(n^1.585). DecInt utilise une combinaison de Karatsuba, Toom-Cook, et Nussbaumer convolution pour obtenir un temps d'exécution de O(n*ln(n)).
Même si DecInt a beaucoup plus élevé des frais généraux, la combinaison de O(n*ln(n)) la multiplication et de O(n) conversion sera finalement plus rapide que Python est O(n^1.585) la multiplication et de O(n^2) la conversion.
Depuis la plupart des calculs ne nécessitent pas tous les résultats pour être affichées en format décimal, presque tous en précision arbitraire de la bibliothèque utilise les binaires depuis qui rend les calculs plus faciles. DecInt cibles à une très petite niche. Pour assez grand nombre, DecInt sera plus rapide pour la multiplication et la division que les Python. Mais si vous êtes après la performance pure, une bibliothèque comme GMPY sera la plus rapide.
Je suis content que vous avez trouvé DecInt utile.
OriginalL'auteur casevh
De 15,9 ms sur mon lent ordinateur portable. C'est l'impression qui vous ralentissent. La conversion de binaire des nombres décimaux est assez lent, qui est une étape nécessaire de l'imprimer. Si vous avez besoin pour la sortie du numéro que vous devriez essayer la DecInt ChristopheD déjà mentionné.
DecInt sera plus lent à faire multiplier, mais de faire de l'impression beaucoup plus rapide
Voici un exemple avec une version légèrement modifiée de votre code. Notez que la conversion d'un de 100000 chaîne de chiffres pour une longue déjà, ~1sec sur cet ordinateur
+1: pour mesurer la performance avant en essayant d'optimiser
les ordinateurs parler binaire. vous pouvez les convertir en binaire et hexadécimal de très simplement et rapidement ( 4 bits ). Il n'y a pas de raccourci comme ça pour convertir un nombre décimal, de sorte qu'il est beaucoup plus lent. Si vous pouvez vous en sortir avec l'aide de hex pour l'entrée et la sortie, vous n'avez pas besoin de tout ces lentes conversions décimal
Merci , je sais que je ne suis pas vraiment nouveau dans le monde de la programmation, je n'ai jamais utilisé Python avant , c'est la première fois que je l'utilise activement les fonctions en python. Et je suis obligé de l'imprimer en décimal.
OriginalL'auteur John La Rooy
Je vous suggère d'aller le Sage math outil, qui a à peu près tous les Python math outil jamais fait roulé dans un seul paquet. Voir si il y a une belle rapide arbitraire de mathématiques de précision de l'outil dans le Sage qui répond à vos besoins.
Ummm pas de bibliothèques, donc si vous trouvez des "mesures appropriées" de la mise en œuvre d'un algorithme différent, vous allez hack votre version de Python?? Combien de temps pensez-vous, un appel à une routine de bibliothèque prendrait?
Si vous ne connaissez pas, alors ne pas le fromage gens en rejetant leurs suggestions des bibliothèques. "Quelque chose comme une fonction à l'intérieur ..." devrait être écrit en Python, et vous êtes préoccupé par la vitesse de la intégrée de longue multiplication qui est écrit en C???
J'aime Python, mais il est en fait plus lent que C du code. Il n'est tout simplement pas possible d'écrire une pure fonction Python pour faire une précision arbitraire multiplier, et pour que la fonction d'être plus rapide qu'une version C de la même fonction. Le haut-précision arbitraire entier de code en Python est probablement à peu près aussi bon que vous pouvez obtenir déjà, mais il y a peu de chance qu'un externe module math (écrit en C) pourrait avoir une fonction qui convient le mieux à vos besoins. Je le répète, c'est impossible pour l'écriture plus rapide de la fonction en pur Python.
juste pour être clair: une pure fonction Python avec un bon algorithme peut battre le code C avec un mauvais algorithme. Mais pourquoi supposez-vous que le haut-précision arbitraire entier mathématiques en Python est écrit avec un mauvais algorithme? Et même si il existe un autre algorithme qui conviennent le mieux à vos besoins, vous serez probablement en mesure de trouver un module chargeable, écrit en C, qui implémente cet algorithme (c'est pourquoi je vous appelle à la Sauge). Sauf s'il est vraiment incroyable algorithme de là, que d'une certaine façon personne n'a jamais fait un module C pour Python encore, vous ne pourrez pas battre le code C avec de la pure code Python.
OriginalL'auteur steveha