9
votes

À propos de la vitesse: Python vs Java

juste curieux de la vitesse de python et de java .. Intuitivement, Python devrait être beaucoup plus lent que Java, mais je veux en savoir plus ... Quelqu'un pourrait-il me donner plus? Ou introduisez un bon post à lire?


32 commentaires

shootout.alioth.debian.org/u32/python.php


Quelle est exactement votre raison de prendre soin?


La vitesse ne compte que pour l'application spécifique que vous avez à l'esprit. Veuillez poster le code que vous souhaitez comparer à Python et en Java. Ensuite, dans le cadre de la publication du code que vous souhaitez comparer, veuillez publier les heures d'exécution pour ce code. Ensuite, nous pouvons vous dire ce qui est plus rapide.


Je pense que c'est une bonne question à demander des résultats "en général" - on ne commence pas toujours par un cas d'utilisation spécifique à l'esprit, mais veut connaître des cas typiques. Tout le monde n'a pas le même champ d'effort de résolution d'un problème concret à la fois; d'autres aiment apprendre à l'avance.


@Staxman: Comme un mauvais choix d'algorithme peut faire des comparaisons «en général» totalement invalides, je ne suis pas sûr qu'ils soient utiles. Comment compareriez-vous une compréhension de la liste Python contre une implémentation Java qui devait être construite à partir de zéro? Je ne vois pas comment "en général" peut être valide quand il y a tellement de cas et de fonctionnalités spéciales.


@ S.LOTT >> Veuillez poster le code que vous souhaitez comparer ... Veuillez poster les heures d'exécution pour ce code. Ensuite, nous pouvons vous dire ce qui est plus rapide. << S'il vous plaît ne soyez pas si obstructif et inutile. Clairement Andy Leman était curieux de voir les exemples d'autres personnes devaient montrer.


@ S.LOTT >> Je ne vois pas comment "en général" peut être valide quand il y a tellement de cas spéciaux et de fonctionnalités. << Voyez-vous comment les statistiques peuvent être valides?


@igouy: "Voyez-vous comment les statistiques peuvent être valides?" C'est mon point. Lorsque Python a une construction spéciale avec une optimisation spéciale, comment est-ce une comparaison statistiquement pertinente contre Java qui manque de cette caractéristique spécifique?


@ S.Lott - Apparemment, vous ne voyez pas comment les statistiques peuvent être valides. Books.google.com/...


@Gouy: Malheureusement, je ne peux pas comprendre pourquoi vous continuez à répéter cette phrase. J'utilise des statistiques quotidiennement (je travaille avec des actuaires). Je ne vois pas à quel point les cas d'étrange de constructions de langage de programmation étranges peuvent être comparées. Si vous pouviez expliquer cela, je serais mieux informé et pourrait apprendre quelque chose.


@ S.Lott - Voyez-vous comment chaque personne est une affaire spéciale (parfois bizarre), et encore des actuaires peuvent faire des déclarations valides sur les "personnes"?


@igouy: En fait, je ne vois pas ça. Ils font des mesures de classes de personnes ayant des attributs similaires. Ils refusent souvent de gérer des cas particuliers étranges (mourir de trois maladies terminales en même temps). De même, ils fabriquent rarement des déclarations «en général», car elles sont prudentes pour assurer que ce sont des comparaisons «pommes à pommes» des choses avec des attributs identiques. Donc, je suis vraiment perdu avec la façon dont les langages de programmation peuvent être comparés en général. J'espère une explication.


@ S.lott - sont-ils invités à faire des déclarations valides sur "personnes"?


@IGouy: Ils font rarement des déclarations «en général» sur les "personnes" parce qu'ils font attention à des comparaisons "pépendant à pommes" des personnes ayant des attributs identiques de manière mesurable. Je ne vois pas comment un code Java peut être comparé contre une fonction de générateur Python. Ils sont trop différents pour inviter une comparaison "en général". J'espère que vous pouvez fournir une éducation réelle sur la façon dont deux langues différentes peuvent être comparées.


@ S.Lott - Dites-vous qu'ils ne seraient pas en mesure de répondre à une question générale?


@igouy: Je ne suis pas sûr de ce que vous voulez. Je ne vois pas comment des questions sur les actuaires m'aideront à comprendre ce que la comparaison "en général" peut éventuellement signifier entre Java et Python. J'espère une définition ou un exemple spécifique d'une comparaison "en général" entre les langages de programmation fondamentalement différents.


@ S.Lott - Vous semblez suggérer que vous connaissiez des statistiques parce que vous travaillez avec des actionnaires. Voyez-vous comment cette table active rend valide «en général» sur la population américaine, même si les personnes de la population américaine ont des attributs largement distincts? SSA.GOV/OACT/Stats/Table4C6.html


@Igouy: Comment cela s'applique-t-il à deux langages de programmation totalement différentes? Une grande population de personnes n'est pas la même que celle de la comparaison de deux langues. Je ne vois pas comment il y a une "base statistique" pour comparer deux choses qui n'ont presque pas d'attributs communs. Plutôt que de donner des exemples de statistiques générales, veuillez expliquer comment comparer deux langues de programmation "en général". Veuillez définir «en général» d'une certaine manière que cette question peut être répondue.


@ S.Lott - S'il vous plaît reconnaître (oui / non) que vous ne voyez pas ou que vous ne voyez pas comment la table Actualité fait des déclarations "en général" valides, afin que nous puissions déplacer la discussion.


@igouy: Une table actuarielle fait des déclarations sur les sous-populations avec des attributs identiques. Cela ne fait pas de réclamations vagues et imprécises "en général". Il fabrique des revendications étroitement définies sur les hommes, les fumeurs, les patients antérieurs du cancer. Comment cette carte pour le vague, non définie "en général" attachée à cette question? Java "en général" désigne tout code Java, y compris très mal écrit. Python "en général" désigne tout code Python, peu importe combien il exploite des caractéristiques uniques de Python. Que signifie "en général", sauf "tout le possible" du code? Même le code qui ne peut pas être comparé.


@ S.Lott - J'ai posté un exemple spécifique d'une table actuarielle et vous a demandé spécifiquement de cet exemple. Les seuls "attributs identiques" présentés dans cette table sont exacts âge et sexe (la "population de la zone de sécurité sociale" est trop vague pour votre notion d'attribute "identique"). Vous n'avez clairement pas tort de suggérer que la table actuarielle fait des réclamations de manière étroite sur les «fumeurs, les patients antérieurs antérieurs du cancer».


@Igouy: Merci de m'avoir aidé à comprendre "en général" avec une comparaison de langage de programmation. Vous avez fait un bon travail de clarification de la manière dont les fonctionnalités étranges et propres de Java peuvent être comparées aux caractéristiques étranges et étranges de Python de manière générale. L'absence de chevauchement entre les langues est habilement traitée par des statistiques. Votre définition claire de «en général» a été utile.


@ S.Lott - '' TWAS Nouvel An et la puanteur de sarcasme remplissait l'air. Même lorsqu'il est présenté avec un exemple spécifique, vous avez refusé de reconnaître que l'exemple constitue des déclarations "en général" valides, et que vous n'avez fourni aucune raison pour laquelle vous pensez que cet exemple spécifique ne fait pas de déclarations "en général" valides. Lorsque vous refusez de reconnaître les faits qui ont été placés devant vous jusqu'à présent, la discussion est bloquée - «Apparemment, vous ne voyez pas comment les statistiques peuvent être valides».


@igouy: J'essaie de comprendre la programmation "en général". Je m'occupe beaucoup de l'actuariat en général. Je veux comprendre la programmation en général. S'il vous plaît simplement définir ce concept "en général" sans recourir au raisonnement élaboré par analogie. Les analogies sont largement inutiles ici, car la population linguistique de programmation est 2 et je ne vois pas comment les statistiques fonctionnent avec seulement 2 entités. Veuillez simplement fournir les instructions / définitions / règles nécessaires pour que je puisse comprendre de quoi vous parlez sans débattre de mon niveau de compréhension des tables actuarielles. Définissez simplement ça, s'il vous plaît.


@IGouy: Si une table actuarielle rend les déclarations valides "en général", que cela a à voir avec Java et Python? Veuillez fournir une définition de «en général» qui peut m'aider. Si cela vous aide, prétendez que je comprenne parfaitement la manière dont les tables actuarielles apportent dans des déclarations générales. Passez. S'il te plaît.


@ S.Lott - Il ne devrait pas y avoir de besoin de deviner ce que vous comprenez lorsque vous prenez un rôle simple dans une conversation. Veuillez reconnaître (oui / non) que vous faites ou que vous ne voyez pas comment cette table actuarielle fait des déclarations valides "en général", afin que nous puissions déplacer la discussion.


@Gouy: [Cela semble totalement stupide.] Oui. Je vois totalement comment cette table actuarielle rend les déclarations valides "en général". S'il vous plaît passez à autre chose. Je le vois totalement. Comment un résumé des points de données multiples s'applique-t-il éventuellement à un univers de 2 points de données, qui sont tous deux des langages de programmation avec peu de fonctionnalités communes? Veuillez définir "en général" car il s'applique à la programmation des performances linguistiques.


@ S.Lott - [totalement stupide de ne pas avoir répondu immédiatement.] Votre tout premier commentaire a parlé de "Le code que vous souhaitez comparer à Python et en Java" - l'univers du code Python et le code Java comporte plus de 2 points de données.


@Gouy: [Cela semble totalement stupide pour exiger des concessions étranges.] Comment est-il possible de comparer cet univers de code? J'ai le code Python est un mauvais exemple de python. J'ai du code Python qui inclut des constructions non disponibles en Java. Comment mesurer Python et Java "en général" lorsque le code n'est pas comparable de quelque manière que je peux voir? Veuillez définir «en général» d'une certaine manière que je peux comparer ces deux langues.


@ S.Lott - [Cela a établi votre accord qu'il peut y avoir des déclarations valides "en général".] Comment est-il possible de comparer l'univers de la population de la zone de sécurité sociale des personnes? Il a des gens qui fument. Il a des gens avec une vision 20/20 et des personnes aveugles de la naissance. Et pourtant, vous voyez totalement comment cette table actuarielle rend valide "en général" déclarations "- et vous devez également comprendre déjà" en général "d'une manière ou d'une autre. (Encore une fois, de votre tout premier commentaire, vous avez parlé de «le code que vous souhaitez comparer à Python et Java» plutôt que de «comparer ces deux langues».)


@Igouy: Veuillez laisser tomber le raisonnement par analogie. S'il te plaît. C'est trop complexe. S'il vous plaît simplement définir la comparaison "en général" entre Java et Python. S'il vous plaît, fournissez-moi simplement une définition de travail de la comparaison "en général" entre deux langues. S'il te plaît. Je ne peux pas raisonner par analogie comme ça. J'ai besoin d'une définition. Veuillez fournir une procédure ou une définition ou quelque chose de pour pouvoir effectuer mes propres comparaisons «en général» entre Java et Python. J'ai besoin d'un moyen d'obtenir les chiffres. Pas un modèle mental complexe mais un processus fini, défini et efficace de comparaison. S'il te plaît.


Dictionary.Cambridge.org/dictionary/britipish/...


4 Réponses :


14
votes

La mise en œuvre standard actuelle de Python (CPPHON) est plus lente que Java, car la mise en œuvre standard CPPHON n'a pas de puissant JIT Compiler . Pourtant.

Il y a eu plusieurs projets dans le but de produire une implémentation plus rapide de Python:

  • PSYCO
  • Swallow sans addition
  • Pypy

    D'après ce que j'ai essayé, certains de ces projets peuvent donner de très bonnes vitesse d'ups pour des algorithmes spécifiques, mais vous ne l'obtiendrez toujours pas pour courir aussi vite que Java pour un code d'application typique. La majeure partie de l'effort actuel semble maintenant être dirigée vers Pypy.


4 commentaires

Ou plutôt un jiteur universel. Il a PSYCO, qui fonctionne uniquement sur les systèmes IA32.


Il existe des implémentations de Python qui incluent un compilateur JIT. psyco.sourceforge.net et CODEESPEAK.net/PYPY/DIST/PYPY/DOC vient à l'esprit.


Soyez prudent de confondre Python - la langue - avec une implémentation spécifique de Python. Une implémentation PY2EXE peut être considérablement plus rapide qu'une implémentation de CPPHON.


Récemment publié PYPY 1.5 est beaucoup plus rapide que CPPHON, dans 6 des repères sur Speed.PyPY.org C'est plus que 10 fois plus vite. Ce serait génial de voir une dernière comparaison de vitesse PYPY VS Java.



11
votes

L'absence de JIT mentionnée est une raison, mais une autre raison est que Python est dynamique. Oui, cela rend la langue plus lente. Vous pouvez voir par vous-même en utilisant Cyron.

Une fonction écrite en python peut souvent être compilée à C avec Cyron. Cela le rend plus rapide. Mais il est très rapide lorsque vous commencez à ajouter des informations de type aux variables et paramètres, car Cython et le C-compilateur C peuvent commencer à appliquer diverses optimisations simples que vous ne pouvez pas faire lorsque les types sont dynamiques.

Une partie de la différence est la dynamicisme inhérente de Python.

sur le futur: Python 3 a des annotations de fonctionnement: http: // www. python.org/dev/peps/pep-3107/ J'espère que dans quelques années de temps, les compilateurs JIT comme Pypy et Oldenswallowlowlowlowal utiliseront ces informations et vous verrez que Python est aussi rapide que Java et avec une application minutieuse de Cyron, encore plus rapide. :)


0 commentaires

2
votes

Je n'ai pas de points de données à donner, mais un aspect intéressant est qu'il existe des implémentations Python sur JVM (Idem pour de nombreuses autres langues dynamiques / scripts) - JPYTHON et Jython par exemple. Cela pourrait permettre à certaines applications python de fonctionner à des vitesses comparables aux applications Java natif, en supposant que la mise en œuvre de Python Runtime lui-même (sur JVM) soit efficace.


0 commentaires

1
votes

Il y a beaucoup de bonnes réponses ici quant à pourquoi Java est plus rapide que Python, 2 des réponses les plus courantes sont que Python est typée de manière dynamique et que Java dispose de plusieurs compilateurs de temps extrêmement puissants (2 qualité de production, plusieurs expérimentations et non pour une utilisation générale) dans son arsenal, avec seulement le runtime de langue courante C # capable de le faire correspondre. C'est vrai, mais même donc, il y a une dernière raison pour laquelle Java est encore plus rapide, et c'est assez étrange, cela a à voir avec les différences de la manière dont l'interprète de Java est conçu, l'interprète de Python.

En ce moment, il s'agit du code source de l'interprète en production pour la mise en œuvre de la référence OpenJDK / Hotspot JVM, Java (un autre interprète hérité du code source JVM est l'ancienne écrite par James Gosling Way Retour Lorsque Java a été créé pour la première fois, mais celui-ci est obsolète et non compilé dans le binaire réel sauf si vous le compilez de la source avec des drapeaux spéciaux à des fins de débogage. Il est suffisamment intéressant, il s'agit de l'interprète chargé de gagner Java la réputation d'être horreur ces jours-ci): https://github.com/openjdk/ JDK / BLOB / MASTER / SRC / HOTSPOT / SABLE / INTERPRÈTE / TEMPATEURIMERPRÈTRE.CPP

Ceci, en revanche, est le segment de code de l'interprète CPPHON qui exécute Python Opcode: https://github.com/python/cpython/blob/ Master / Python / Ceval.c # L1847

remarque quelque chose de différent entre les 2?

tandis que CPPHON a une boucle massive avec un étui de commutation pour chaque opcode possible (ceci est vrai pour presque tous les autres interprètes, autres que Java), il n'y a pas une seule boucle, si sinon, ou cas d'échange dans l'interprète de Java. Pourquoi est-ce?

La réponse est que l'interprète de Java est un type spécial appelé interprète de modèle, lequel à ce jour est celui qui est le seul à être gentil. Contrairement à la plupart des conceptions, au lieu d'un étui de commutation pour évaluer Java Bytecode, l'interprète de Java a une grande arrayliste de bytecode, mappée sur la langue de la machine natale lorsque l'application est lancée. De cette façon, l'interprète Java n'a pas besoin d'évaluer le bytecode, il insère simplement le bytecode en tant qu'index de tableau, charge la langue de la machine natif et le gère directement sur la CPU. Cela signifie que "l'interpréteur" de Java est en fait un compilateur de réduction, car il exécute votre code directement sur le matériel. CPPHON D'autre part, comme beaucoup d'autres interprètes aujourd'hui, est une exécution de l'interprète du moulin en bytecode, qui traite un opcode Python dans des logiciels. Cela rend évidemment plus lentement python que Java, même sans JIT.

Pourquoi Java dispose d'un tel design d'interpréteur unique non utilisé nulle part ailleurs, c'est parce qu'il doit exécuter le code interprété directement avec le code compilé JIT de manière transparente et que la conception ingénieuse de l'interprète contient une table avec Bytecode-> Langue de la machine paires plutôt que cela l'exécute directement dans des logiciels était le meilleur moyen d'atteindre cet objectif.


0 commentaires