CPython est particulièrement lent parce qu'il n'a pas d'optimiseur Just in Time (puisqu'il s'agit de l'implémentation de référence et qu'il choisit la simplicité au détriment de la performance dans certains cas). Hirondelle déchargée est un projet visant à ajouter un JIT soutenu par LLVM dans CPython, et permet d'obtenir des accélérations massives. Il est possible que Jython et IronPython soient beaucoup plus rapides que CPython car ils sont soutenus par des machines virtuelles fortement optimisées (JVM et .NET CLR).
Une chose qui rendra Python plus lent, c'est qu'il est typiquement dynamique, et qu'il y a des tonnes de recherches pour chaque accès à un attribut.
Par exemple, appeler f
sur un objet A
entraînera d'éventuelles recherches dans la base de données __dict__
appelle à __getattr__
etc, puis appeler enfin __call__
sur l'objet appelable f
.
En ce qui concerne le typage dynamique, de nombreuses optimisations sont possibles si l'on sait à quel type de données on a affaire. Par exemple, en Java ou en C, si vous avez un tableau d'entiers que vous voulez additionner, le code d'assemblage final peut être aussi simple que d'aller chercher la valeur à l'index i
en l'ajoutant à la liste des accumulator
puis en incrémentant i
.
En Python, il est très difficile d'obtenir un code aussi optimal. Supposons que vous ayez un objet de sous-classe de liste contenant int
s. Avant même d'en ajouter, Python doit appeler list.__getitem__(i)
puis l'ajouter à l'"accumulateur" en appelant accumulator.__add__(n)
puis répéter. Des tonnes de recherches alternatives peuvent se produire ici parce qu'un autre fil de discussion peut avoir modifié, par exemple, le fichier __getitem__
le dict de l'instance de liste ou le dict de la classe, entre les appels à add ou getitem. Même le fait de trouver l'accumulateur et la liste (et toute variable utilisée) dans l'espace de noms local entraîne une recherche dans le dict. Ce même surcoût s'applique lors de l'utilisation de tout objet défini par l'utilisateur, bien que pour certains types intégrés, il soit quelque peu atténué.
Il convient également de noter que les types primitifs tels que bigint (int dans Python 3, long dans Python 2.x), list, set, dict, etc, etc, sont ceux que les gens utilisent le plus en Python. Il y a des tonnes d'opérations intégrées sur ces objets qui sont déjà suffisamment optimisées. Par exemple, pour l'exemple ci-dessus, il suffit d'appeler sum(list)
au lieu d'utiliser un accumulateur et un index. En vous en tenant à cela, et en faisant un peu de calcul avec int/float/complex, vous n'aurez généralement pas de problèmes de vitesse, et si c'est le cas, il y a probablement une petite unité critique (une fonction SHA2 digest, par exemple) que vous pouvez simplement déplacer vers le C (ou le code Java, dans Jython). Le fait est que lorsque vous codez en C ou en C++, vous allez gaspiller de l'énergie et de l'argent. lots de temps pour faire des choses que vous pouvez faire en quelques secondes/lignes de code Python. Je dirais que le compromis en vaut toujours la peine, sauf dans les cas où vous faites quelque chose comme de la programmation embarquée ou en temps réel et que vous ne pouvez pas vous le permettre.
21 votes
Savez-vous que Python est interprété ?
11 votes
@kaizer.se - alors nous devons aussi dire les autres vérités évidentes, nous ne travaillons pas avec des langages de programmation mais avec des implémentations de langages de programmation ; etc etc
7 votes
@kaizer.se : oui, nous savons, nous savons. Mais imaginez à quel point il est gênant d'écrire en évitant des commentaires comme les vôtres. "Pourquoi le code Python (exécuté avec n'importe quel interpréteur courant) est-il si lent ?"
6 votes
Après de nombreuses discussions Cette question a donc bénéficié d'une seconde chance. J'ai modifié le ton pour éviter qu'elle ne soit (re)fermée et (re)supprimée. Je suis étonné qu'aucun des 1000 spectateurs de cette question, dont beaucoup ont voté en faveur de la question ou des réponses, n'ait jugé bon de contester la raison de la fermeture ou d'agir pour corriger le ton argumentatif de la question.