Pourquoi Python semble-t-il plus lent, en moyenne, que C/C++ ? J'ai appris Python comme premier langage de programmation, mais je viens juste de commencer avec C et j'ai déjà l'impression de voir une nette différence.
Réponses
Trop de publicités?Python est généralement mis en œuvre comme un langage de script. Cela signifie qu'il passe par un interpréteur qui traduit le code à la volée en langage machine plutôt que d'avoir l'exécutable entièrement en langage machine dès le départ. Par conséquent, il doit payer le coût de la traduction du code en plus de son exécution. Cela vaut également pour CPython, même s'il compile en bytecode, qui est plus proche du langage machine et peut donc être traduit plus rapidement. Python propose également des fonctionnalités d'exécution très utiles, comme le typage dynamique, mais ces fonctionnalités ne peuvent généralement pas être mises en œuvre, même dans les implémentations les plus efficaces, sans entraîner des coûts d'exécution élevés.
Si vous effectuez un travail très intensif en termes de processeur, comme l'écriture de shaders, il n'est pas rare que Python soit environ 200 fois plus lent que C++. Si vous utilisez CPython, ce temps peut être réduit de moitié, mais il est encore loin d'être aussi rapide. Tous ces avantages de runtmie ont un prix. Il existe de nombreux benchmarks qui le démontrent et voici une particulièrement bonne. Comme il est admis en première page, les critères de référence sont imparfaits. Ils sont tous soumis par des utilisateurs qui font de leur mieux pour écrire un code efficace dans le langage de leur choix, mais ils vous donnent une bonne idée générale.
Je vous recommande d'essayer de mélanger les deux si vous êtes soucieux de l'efficacité : vous obtiendrez alors le meilleur des deux mondes. Je suis principalement un programmeur C++, mais je pense que beaucoup de gens ont tendance à coder trop de code de haut niveau en C++ alors que c'est juste une nuisance (les temps de compilation ne sont qu'un exemple parmi d'autres). Mélanger un langage de script avec un langage efficace comme C/C++ qui est plus proche du métal est vraiment la voie à suivre pour équilibrer l'efficacité du programmeur (productivité) avec l'efficacité du traitement.
Outre les réponses déjà données, Python permet de modifier les choses en cours d'exécution, ce qui n'est pas possible dans d'autres langages comme le C. Vous pouvez ajouter des fonctions membres aux classes au fur et à mesure que vous avancez.
De plus, la nature dynamique de Python rend impossible de dire quel type de paramètres sera passé à une fonction, ce qui rend l'optimisation beaucoup plus difficile.
RPython semble être un moyen de contourner le problème d'optimisation.
Néanmoins, il ne sera probablement pas aussi performant que le langage C pour le calcul des nombres et d'autres tâches similaires.
Python est un langage de programmation de haut niveau. Voici comment s'exécute un script python :
Le code source python est d'abord compilé en Code octet . Oui, vous avez bien entendu ! Bien que Python soit un langage interprété, il est d'abord compilé en code d'octets. Ce code est ensuite interprété et exécuté par le programme Machine virtuelle Python (PVM).
Cette compilation et cette exécution rendent Python plus lent que d'autres langages de bas niveau tels que C/C++. Dans des langages tels que C/C++, le code source est compilé en code binaire qui peuvent être directement exécutés par le CPU, ce qui rend leur exécution plus efficace que celle de Python.
Cette réponse s'applique à python3. La plupart des gens ne savent pas qu'une compilation de type JIT se produit chaque fois que vous utilisez l'instruction import. CPython recherche le fichier source importé (.py), prend note de la date de modification, puis recherche le fichier compilé en code binaire (.pyc) dans un sous-dossier nommé "_ _ pycache _ _" (dunder pycache dunder). Si tout correspond, votre programme utilisera ce fichier bytecode jusqu'à ce que quelque chose change (vous modifiez le fichier source ou mettez à jour Python).
Mais cela ne se produit jamais avec le programme principal, qui est généralement lancé à partir d'un shell BASH, de manière interactive ou via. Voici un exemple :
#!/usr/bin/python3
# title : /var/www/cgi-bin/name2.py
# author: Neil Rieck
# edit : 2019-10-19
# ==================
import name3 # name3.py will be cache-checked and/or compiled
import name4 # name4.py will be cache-checked and/or compiled
import name5 # name5.py will be cache-checked and/or compiled
#
def main():
#
# code that uses the imported libraries goes here
#
if __name__ == "__main__":
main()
#
Une fois exécuté, le code de sortie compilé sera supprimé. Cependant, votre programme python principal sera compilé si vous le démarrez via une déclaration d'importation comme suit :
#!/usr/bin/python3
# title : /var/www/cgi-bin/name1
# author: Neil Rieck
# edit : 2019-10-19
# ==================
import name2 # name2.py will be cache-checked and/or compiled
#name2.main() #
Et maintenant, les mises en garde :
- si vous testez du code de manière interactive dans la zone Apache, votre fichier compilé peut être sauvegardé avec des privilèges qu'Apache ne peut pas lire (ou écrire lors d'une recompilation).
- certains prétendent que le sous-dossier "_ _ pycache _ _" (dunder pycache dunder) doit être disponible dans la configuration d'Apache
- SELinux permettra-t-il à CPython d'écrire dans un sous-dossier (c'était un problème dans CentOS-7.5 mais je crois qu'un correctif a été mis à disposition).
Un dernier point. Vous pouvez accéder au compilateur vous-même, générer les fichiers pyc, puis modifier les bits de protection comme solution de contournement à l'une des mises en garde que j'ai énumérées. Voici deux exemples :
method #1
=========
python3
import py_compile
py_compile("name1.py")
exit()
method #2
=========
python3 -m py_compile name1.py
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.