12
votes

Python avec NUMPY / SICPY vs. pur c ++ pour une analyse de données importante

Faire du python sur des projets relativement faibles me fait comprendre la nature dynamique de cette langue (pas besoin de code de déclaration pour garder une trace des types), ce qui fait souvent un processus de développement plus rapide et moins douloureux en cours de route. Cependant, je pense que dans des projets beaucoup plus importants, cela pourrait en réalité être un obstacle, car le code serait plus lent que celui de son équivalent en C ++. Mais encore une fois, à l'aide de NUMPY et / ou SCIPY avec Python peut faire fonctionner votre code aussi rapidement qu'un programme natif C ++ (où le code en C ++ prendrait parfois plus de temps à développer).

i postez cette question après la lecture de Justin Peel's Commenter sur le thread " est python plus rapide et plus léger que c ++? "où il déclare: "En outre, les personnes qui parlent de Python sont lentes pour un nombre sérieux crunching n'ont pas utilisé les modules numpés et scipés. Python décolle vraiment en calcul scientifique ces jours-ci. Bien sûr, la vitesse provient de l'utilisation de modules écrits dans C ou des bibliothèques écrites En Fortran, mais c'est la beauté d'une langue de script à mon avis. " Ou comme S. Lott écrit sur le même fil de Python: "... Comme il gère la mémoire pour moi, je n'ai pas à faire de la gestion de la mémoire, économisant des heures de chasser les fuites de base." J'ai également inspecté une question de performance liée à Python / numpy / c ++ sur " Benchmarking ( Python vs c ++ en utilisant blas) et (numpy) "où jf Sebastian écrit" ... Il n'y a pas de différence entre C ++ et Numpy sur ma machine. "

Ces deux threads me demandaient de se demander s'il existe un avantage réel conféré à la connaissance de C ++ pour un programmeur Python qui utilise numpy / scipe pour la production de logiciels pour analyser «Big Data» où la performance est évidemment d'une grande importance (mais aussi du code La lisibilité et la vitesse de développement sont un must)?

Remarque: je suis particulièrement intéressé par la gestion des fichiers texte énormes. Fichiers texte de l'ordre des lignes de 100K-800K avec plusieurs colonnes, où Python pourrait prendre une bonne 5 minutes pour analyser un fichier "uniquement" 200K lignes de 200k.


1 commentaires

Si vous êtes vraiment préoccupé par la vitesse de ces fichiers texte, il serait utile de comparer l'analyse comparative lorsque le temps est passé - probablement surtout dans l'accès des disques comme @henrykekiter suggère, mais si le traitement du texte ajoute de manière significative, vous pouvez trouver des gains par intelligemment À l'aide de Python Construits (qui sera beaucoup plus rapide que les boucles Python, etc.) et / ou traiter le texte avec Cyron (avec C_TYPES approprié - un peu plus d'une courbe d'apprentissage, mais probablement plus facile que c ++).


3 Réponses :


5
votes

La réponse courte est celle pour des problèmes simples, il ne devrait pas y avoir beaucoup de différence. Si vous voulez faire quelque chose de compliqué, vous rencontrez rapidement des différences de performances Stark.

comme exemple simple, essayez d'ajouter trois vecteurs ensemble xxx

en python, comme Je comprends cela, cela ajoute généralement B à C , ajoute le résultat à d , puis apportez un point sur ce résultat final. Chacune de ces opérations peut être rapide car elles ne sont que d'agriculture à une bibliothèque de Blas. Toutefois, si les vecteurs sont grands, le résultat intermédiaire ne peut pas être stocké dans le cache. Déplacement de ce résultat intermédiaire à la mémoire principale est lent.

Vous pouvez faire la même chose en C ++ à l'aide de Valarray et il sera lent de manière équivalente. Cependant, vous pouvez également faire quelque chose d'autre xxx

ceci se débarrasse du résultat intermédiaire et rend le code moins sensible à la vitesse à la mémoire principale.

faire La chose équivalente en python est possible, mais les constructions de bouclage de Python ne sont pas aussi efficaces. Ils font de belles choses comme des chèques liées, mais parfois, il est plus rapide de courir avec les préoccupations de sécurité désengagées. Java, par exemple, est une bonne quantité de travail pour supprimer les contrôles de limites. Donc, si vous aviez un compilateur / JIT suffisamment intelligent, les boucles de Python pourraient être rapides. En pratique, cela n'a pas fonctionné.


3 commentaires

J'aurais dû spécifier dans ma question que je ne suis pas tellement intéressé par les matrices multidimensionnelles que je suis dans d'énormes fichiers texte. Fichiers texte de l'ordre des lignes de 100k-800K avec plusieurs colonnes, où Python pourrait prendre cinq bonnes minutes pour analyser un fichier "seulement" 200K lignes longues.


Utilisez A = numexpr.evaluat ('B + C + D')


@warship: L'argument de la création de boucles optimisées personnalisées au lieu de coller ensemble des blocs de construction optimisés s'applique plus généralement. Si Vous prenez le temps de vous vectoriser manuellement avec SIMD, (ou écrivez C ++ pouvant auto-vectoriser), vous pouvez obtenir des performances rapides flammes, en particulier dans le cache L1D ou L2. Si les blocs de construction standard ne font pas le travail effectué en une ou deux étapes, la boucle manuelle peut être une grosse victoire en C ++.



11
votes

Tout d'abord, si la majeure partie de votre "travail" provient de traiter d'énormes fichiers texte, cela signifie souvent que votre seul goulot d'étranglement de vitesse significatif est votre vitesse d'E / S de disque, quel que soit le langage de programmation.


sur la question principale, c'est probablement trop riche en opinion à "répondre", mais je peux au moins vous donner ma propre expérience. J'ai écrit Python pour faire un grand traitement de données (conditions météorologiques et environnementales) pendant des années. Je n'ai jamais rencontré de problèmes de performance significatifs en raison de la langue.

Quelque chose que les développeurs (moi-même inclus) ont tendance à oublier, c'est qu'une fois que le processus est exécuté assez rapide , c'est un gaspillage de ressources de l'entreprise pour passer du temps à le faire fonctionner plus rapidement. Python (à l'aide d'outils matures comme pandas / sciped ) fonctionne assez vite pour répondre aux exigences, et il est rapide de développer, donc pour mon argent, c'est parfaitement Langue acceptable pour le traitement "Big Data".


4 commentaires

Je sais que les données météorologiques et environnementales se situent sur l'échelle des téraoctets, en faisant souvent des cadres tels que Hadoop très utiles (où la langue innée est Java (mais également en streaming Python et C ++)). Depuis votre expérience multi-éloigne Travailler avec de telles données à l'aide de Python, avez-vous déjà constaté qu'il existe des moments où la mise en œuvre de vos solutions en C ++ serait plus propice à des fins de qualité supérieure (bien que moins productives en termes de vitesse de développement et de coûts)?


@ XYZ927 Je n'ai jamais trouvé Python d'être un goulot d'étranglement significatif. Comme vous l'avez noté, des packages sont optimisés et je n'ai personnellement jamais rencontré un cas où ils sont insuffisants. En particulier, compte tenu de la complexité de ces processus, je pense que la lisibilité et la clarté de Python sont un avantage énorme. pourrait ils seront faits plus rapidement en pure C / C ++ / Fortran? Probablement, mais personnellement, je n'ai pas trouvé cela valant l'effort de développement. Ces choses ont tendance à être courues pendant la nuit de toute façon, aussi longtemps que cela se fait au matin, qui se soucie de la fin de 4h30 ou de 5h00?


Merci pour votre avis. J'aimerais également faire référence à un autre poste que j'ai trouvé sur cette question qui montre que le code C ++, s'il n'est pas écrit d'une certaine manière, peut réellement courir plus lentement que Python: Stackoverflow.com / Questions / 9371238 / ...


Lol oui, c'est la raison pour laquelle les gros fonds de couverture utilisent purement C ++. Ils ne savent tout simplement pas que Python est "bon" pour les grandes données



1
votes

python sauvera certainement votre temps de développement, il vous fournit une flexibilité si vous comparez simplement deux langues ici, bien qu'elle ne puisse toujours pas correspondre à la puissance et aux performances de C / C ++ mais qui se soucie de cet âge de haute mémoire, de clusters, de mise en cache et de techniques de traitement parallèle? Un autre inconvénient avec C ++ peut être les accidents possibles, puis le débogage et la fixation avec de grandes données peuvent être un cauchemar.

Mais ayant dit que je n'ai pas vu un endroit où il y a une taille d'ajustement, toute solution est disponible, aucun langage de programmation ne contient de solutions à chaque problème (sauf si vous êtes un ancien développeur C natif qui aime construire la base de données en C De plus :) Vous devez d'abord identifier tous les problèmes, les exigences, le type de données, qu'il soit structuré ou non structuré, quel type de fichiers texte que vous devez manipuler de quelle manière et quelle commande est en train de programmer un problème et ainsi de suite. .. Ensuite, vous devez construire une pile complète d'applications avec des ensembles d'outils et des langages de script. Comme si vous pouvez toujours mettre plus d'argent dans le matériel ou même acheter un outil coûteux comme AB Initioio qui vous permet de charger et d'analyser ces gros fichiers texte et de manipuler sur les données, à moins que vous n'ayez pas besoin de véritable hauteur. Capacités de correspondance des motifs de fin sur les fichiers de données vraiment BIGGG, Python serait tout simplement bien avec une conjonction d'autres outils. Mais je ne vois pas une seule réponse oui / non, dans certaines situations, Python peut ne pas être la meilleure solution.


0 commentaires