10
votes

À quelle vitesse est python?

Je suis un programmeur Java et s'il y a une chose que je n'aime pas à ce sujet, ce serait une vitesse. Java semble vraiment lent, mais beaucoup de programmes de scripts Python que j'ai écrit jusqu'à présent semblent vraiment rapides.

Alors je me demandais si Python est plus rapide que Java, ou C # et comment cela se compare à C / C ++ (que je pense que cela sera plus lent que)?


9 commentaires

Aussi vite qu'un morceau de chaîne est long.


Java- 100 miles / h, python 200 miles / h, c / C ++ 1000 miles / h


Xinus, comment pouvez-vous même dire ça?


@Geo: Juste une femme sauvage. Cela dépend des conditions de la route, de la machine à réglage, du carburant et de nombreux autres facteurs ...


La vitesse d'un python est approximativement ... attendons, parlons-nous d'un python européen ou d'un python africain?


@Xinus: En réalité, si vous lisez la réponse de Keyle, le Java "Machine Tunning" est plus rapide que c ++, après "Tonge de la machine" C ++ est plus rapide que Java. Python est plus lent que les deux.


@Bob Dylan: Si vous lisez ma réponse, vous constaterez rapidement que dans ce cas, C ++ étant plus lent est surtout une question de pessimisation. La réécriture simplement à être simple et sensble le rend vite sans optimisation «spécifique à la machine» (ou toute tentative réelle d'optimisation).


@Bob Dylan: "Java semble vraiment lent" - lent à faire quoi? "Les programmes Python que j'ai écrites jusqu'à présent semblent vraiment rapides" - je suis rapide pour faire quoi?


Les blagues ci-dessus sont la dissonance cognitive visant à distraire du fait que Python est (après tout est dit et fait, à la fin de la journée en production) environ 1 ordre de grandeur plus lent que Java. C'est-à-dire que tout le reste étant égal, un programme Python prendra 10 fois plus long pour terminer le travail à portée de main que le programme Java identique. La raison de ceci est des boucles, Python ne peut pas les faire rapidement car l'interprète n'a pas de train de fret compilateur juste à temps pour optimiser votre boucle sur la CPU.


8 Réponses :


23
votes

Cela dépend totalement de l'Usecase. Pour les applications longues (comme des serveurs comme des serveurs), Java s'est révélée extrêmement rapide - encore plus rapide que C. Ceci est possible car le JVM pourrait compiler à chaud Bytecode au code de la machine. Tout en faisant cela, cela peut prendre pleinement parti de chaque caractéristique de la CPU. Cela n'est généralement pas possible pour C, au moins dès que vous quittez votre environnement de laboratoire: supposez simplement la distribution d'une douzaine de bâtiments optimisées à vos clients - cela ne fonctionnera tout simplement pas.

Mais retour à votre question: cela dépend vraiment. Par exemple. Si le temps de démarrage est un problème (qui n'est pas un problème pour une application de serveur par exemple), Java pourrait ne pas être le meilleur choix. Cela peut également dépendre de l'endroit où vos zones de code chaud sont les suivantes: s'ils se trouvent dans des bibliothèques indigènes avec un code Python, vous pourrez simplement les coller ensemble, vous pourrez également obtenir des performances de Python.

Typiquement, les langues de script auront tendance à être plus lentes - au moins la plupart du temps.


0 commentaires

4
votes

Voici une autre Stackoverflow Question qui semble plus complète: vous pourriez aussi regarder au Shootout de langue d'ordinateur .


5 commentaires

Woops. Merci pour le lien alternatif.


Et pourtant, Psyco, un compilateur Python Jit n'est pas autorisé dans la fusillade ...


PYPCO a été montré en 2008, voici le lien InternetArchive, pourquoi n'utilisez-vous pas les scripts Python Le jeu de référence fournit des mesures publiées pour vos implémentations de langue préférée? web.archive.org/web/20080606020118/http://.../a>


@igouy s'il vous plaît ne changez pas de contenu de réponse


410 parti. @Ak_ Veuillez corriger l'URL.



31
votes

7 commentaires

J'aime ton terme "assez rapide". Cela a certainement été mon expérience avec Python aussi.


+1 pour "assez rapide" - les gens ont tendance à passer beaucoup trop de temps à parler de la performance de toute façon


GCC :: g ++ :: java :: c # mono :: cpython :: python 3 shootout.alioth.debian.org/u32/...


"Assez vite" pour tout ce qui n'a pas besoin d'être rapide :-)


@igouy et ensuite vous écrivez les pièces qui doivent être rapides en Cython ou utiliser des numéros, le cas échéant.


@Justin Peel - ou c ou autre chose que vous pouvez travailler autour du problème - et bien sûr si Python était vraiment "assez rapide" pour ce que vous vouliez, vous ne seriez pas obligé de réécrire.


@Gouy: Je suppose que lorsque vous cultivez une équipe de développeurs moins expérimentés, ils peuvent écrire du code en C ++ "assez rapide" pour tout projet qui n'a pas besoin d'être écrit "rapide". Je pense que le point limonad tente de faire est que dans un environnement de travail pratiquement contraint, la performance de la langue n'est pas nécessairement "roi".



4
votes

Si vous voulez une vitesse en python, surtout pour les algorithmes complexes, Psyco aide généralement. De leur page Web:

Pensez à Psyco comme une sorte de compilateur juste à temps (JIT), un peu peu comme ce qui existe pour d'autres langues, ce code émetteur de machine sur la mouche au lieu d'interpréter votre Programme Python étape par étape. Les différence avec le traditionnel approche des compilateurs JIT est que Psyco écrit plusieurs versions de la mêmes blocs (un bloc est un peu un fonction), qui sont optimisés par Être spécialisé pour certaines genres de variables (une "type" peut signifier un type, Mais c'est plus général). Le résultat est que vos programmes de python non modifiés courir plus vite.

2x à 100X abritures, typiquement 4x, avec un interprète python non modifié et code source non modifié, juste un Extension C charrable dynamique Module.

étrangement, il n'a pas été mentionné dans les liens ci-dessus.


4 commentaires

Ils ont oublié de dire un chapeau parfois un ralentissement est atteint XD


Malheureusement, psycho n'a pas été développée depuis plusieurs années et ne fonctionnera jamais sur 64 bits.


@THROPE: C'est parce que PSYCO est obsolète en faveur de PYPY, qui a récemment dépassé la performance de PSYCO lorsque le X86 JIT Backend a finalement mis en œuvre des INT et des flotteurs. Pypy est un générateur JIT.


Psycho vous donnera plus de performance de Java. Vous obtiendrez des heures de début plus lentes et une utilisation de la mémoire supérieure en échange d'algorithmes plus rapides.



0
votes

C'est une question que vous ne pouvez pas répondre correctement, car tout dépend quand il doit être rapide. Java est bon pour d'énormes serveurs, c'est mauvais lorsque vous devez ré-compiler et tester beaucoup de fois votre code (la compilation est SOOOOOOOO lente). Python n'a même pas besoin d'être compilé pour tester!

Dans l'environnement de production, il est totalement stupide de dire que Java est plus rapide que c ... c'est comme dire que c est plus rapide que l'assemblage.

Quoi qu'il en soit, il n'est pas possible de répondre précisément: tout dépend de ce que vous voulez / besoin.


3 commentaires

Je ne peux pas accepter votre affirmation selon laquelle le code Java est difficile à tester. Compilation incrémentielle et remplacement de code à chaud Make Test Java vraiment rapide - je ne le remarque normalement pas. En outre, il n'est pas stupide de dire que Java ne peut pas être plus rapide que C. La JVM essaiera de compiler des zones de code à chaud au code de la machine. Ce code de machine sera fortement optimisé pour la machine qu'il fonctionne. Pour C, vous pourriez-vous le faire au moment de la compilation - mais vous ne pouvez pas toujours prédire la machine que le code va fonctionner, il peut donc être compilé pour I386 de satisfaire la plupart des clients.


Je suis d'accord avec vous sur les choses Java. Mais pour C, il est toujours à propos de qui le compose. Si vous faites un bon makefile et que vous développez correctement, il n'est pas possible du tout que le même code Java compilé sera plus rapide. Pas du tout. Le seul cas possible lorsque vous avez le même développeur qui se développe en Java et code un mauvais code avec un mauvais maquillage et compare la vitesse. Tout concerne les compétences du développeur. La seule chose que vous puissiez dire, c'est que "Java est parfois plus rapide que c si le développeur ne sait pas C"!. Mais c est TOUJOURS au pire aussi vite que Java.


Pour des raisons pratiques, de nombreux programmes C / C ++ expédient uniquement un seul exécutable (ou aussi peu d'exécutables que possible avec, par exemple un pour Mac et un pour Windows). Étant donné que l'un exécutable sera probablement aussi vanille que possible, de sorte que le programme puisse fonctionner autant de machines que possible. Cela signifie que si vous avez une nouvelle CPU avec une nouvelle nouvelle instruction, qui peut être utilisée pour accélérer l'exécution, ladite nouvelle instruction ne sera probablement pas utilisée par la plupart des programmes C / C ++. Les programmes Java, OTOH, peuvent tous en tirer parti dès que votre Java Runtime Jit le sait à ce sujet.



2
votes

Il est très difficile de faire une comparaison véritablement objective et générale de la vitesse d'exécution de deux langues. En comparant deux langues x et y, on trouve souvent X est plus rapide que Y à certains égards tout en étant plus lent dans d'autres. Pour moi, cela rend les points de repère / comparaisons disponibles en ligne largement inutiles. Le meilleur moyen est de le tester vous-même et de voir à quel point chaque langue est rapide pour le travail que vous faites.

Cela dit, il y a certaines choses que l'on veut se rappeler lors du test de langues comme Java et Python. Le code dans ces langues peut souvent être accéléré de manière significative en utilisant des constructions plus adaptées à la langue (par exemple, des compréhensions de liste dans Python ou en utilisant Char [] et StringBuilder pour certaines opérations de chaîne en Java). De plus, pour Python, l'utilisation de PSYCO peut considérablement augmenter la vitesse du programme. Et puis il y a toute la question de l'utilisation de structures de données appropriées et de garder un œil sur la complexité d'exécution de votre code.


1 commentaires

"Votre application est la référence ultime" Shootout. alioth.debian.org/u32/...



1
votes

Je pense que la réponse de Keyle (entre autres) apporte à la maison un point de base: une quantité énorme dépend de la façon dont vous faites les choses. Ce lien a donné deux réponses pour C ++, mais j'ai du mal à croire que quiconque écrirait normalement C ++ qui ressemble beaucoup à celui de l'un ou l'autre. Ma première tentative ressemblerait à ceci comme suit:

#include <iostream>
#include <vector>
#include <time.h>

class person { 
    int count_;
    static int current_;
public:
    person() : count_(++current_) {}
    int count() { return count_; }
};
int person::current_ = 0;
typedef std::vector<person> plist;
class chain {
    plist people_;
    void check_wrap(std::vector<person>::iterator &p) {
        if (p==people_.end())
            p = people_.begin();
    }
    void advance(std::vector<person>::iterator &p, int places) {
        for (int i=0; i<places; i++)
            check_wrap(++p);
    }
public:
    chain(int length) : people_(length) {}
    person *kill(int n) { 
        plist::iterator current = people_.begin();
        while (people_.size()>1) {
            advance(current, n);
            current = people_.erase(current);
            check_wrap(current);
        }
        return &(*current);
    }
};
int main() {
    const int ITER = 1000000;  
    clock_t start = clock();
    for(int i = 0 ; i <ITER; i++) {
        chain c(40);
        c.kill(3);  
    }
    clock_t end = clock();
    std::cout << "Time per iterator: " << (((end - start) /(double)CLOCKS_PER_SEC/ITER)*1000000 << " microseconds.\n";
    return 0;
}


2 commentaires

En effet, bien que votre algorithme soit probablement brisé. En ce qui concerne la comparaison entre Java et C ++, cela ne montre probablement que si la petite allocation d'objet / distribution n'est pas une force de C ++. Une approche simple et 3 à 4 fois plus courte avec un vecteur (même si alloué à nouveau pour chaque itération) et Erase a montré que le code C ++ pourrait être fait de manière triviale 5-6 fois plus rapide, sans rien de fantaisie. Je soupçonne que la référence est également sous-optimale pour d'autres langues, aussi possible pour Java.


C'est probablement sous-optimal pour Java, mais avec Java, cela ne fait probablement pas presque autant de différence. Une partie de ce code est cassée (j'ai oublié ce vecteur remplit une copie d'un seul objet au lieu de créer chaque objet de manière indépendante, de sorte qu'ils obtiennent tous un comptent _ de 1. Autre cela, je le crois fonctionne correctement.



0
votes

Pour le python, la vitesse dépend également des implémentations d'interpréter ... J'ai vu que Pypy est généralement plus rapide que cpython.


0 commentaires