[JAVA] Prise en compte des forces et faiblesses de Python

Python est un très bon langage. Il ne fait aucun doute qu'il s'agit d'une plate-forme de programmation très reconnaissante qui fournit de nombreuses bibliothèques hautes performances et hautes performances et peut réaliser un traitement avancé de l'information même pour les personnes qui ne sont pas familiarisées avec l'ingénierie de l'information.   Cependant, il n'est pas bon de croire aveuglément ou de surconfigurer Python. Par conséquent, j'écris cet article avec l'espoir qu'il servira de référence pour comprendre les forces et les faiblesses de Python et en faire un usage efficace. Je pense que la bonne façon de l'utiliser est de combiner les bons points de Python avec d'autres systèmes de traitement du langage.   Le texte pour apprendre Python est basé sur ceci. → J'ai fait un texte en Python

Expérience sur le temps d'exécution de Python

● Comparaison de vitesse en simulant une orbite circulaire (C vs Python, Cython vs Python) C'est une victoire écrasante en langage C. Le résultat montre que C est plus de 25 fois plus rapide que Python. Cependant, pour un programme de calcul numérique simple comme celui-ci, vous pouvez également voir que l'utilisation de Cython peut atteindre des vitesses comparables à celles du langage C sans apporter de modifications majeures au programme Python.   ● Génération d'images de l'ensemble Mandelbrot (JavaScript vs Python, Cython vs Python) Ceci est un exemple qui visualise l'ensemble de Mandelbrot sous la forme d'une image d'une taille de 1024 x 1024. (L'environnement d'exécution utilisé pour la comparaison de vitesse est Windows10, Intel Core i7-5500U 2,39 GHz) → Exemple d'implémentation HTML5 (JavaScript) Cliquez sur le bouton `démarrer 'pour exécuter Le temps d'exécution moyen était de 0,231 seconde. (Utilisation de Google Chrome) → Exemple d'implémentation Python + Pillow Après le téléchargement   py MandelbrotPython.py m.png -2.0 2.0 -2.0 2.0 Exécutez en tant que. (L'image est générée en m.png) Le temps d'exécution moyen était de 53,645 secondes. En comparant le temps d'exécution, il était de 232,23 fois. Commenter la partie qui appelle Pillow n'a pas d'effet notable sur le temps d'exécution. C'est une victoire écrasante pour JavaScript. Bien sûr, cela dépend du navigateur que vous exécutez, mais c'est toujours une victoire à deux chiffres. → Exemple d'implémentation Cython + Pillow Après le téléchargement, compilez avec le système de traitement Cython pour créer un module Python   import MandelbrotPyx   MandelbrotPyx.MakeMandelbrot('m2.png',-2.0,2.0,-2.0,2.0) Etc. Le temps d'exécution dans le même environnement informatique est en moyenne de 7,601 secondes était. En traitant avec Cython, nous avons pu accélérer environ 7 fois. (Il y a encore place à l'optimisation)   En passant, la vitesse d'exécution de Java et JavaScript approche C ces jours-ci. (JavaScript Super Introduction Text, Java Super Introductory Text)   ● Comparaison de la vitesse des listes / ensembles / dictionnaires Python est un bon environnement pour traiter de grandes quantités de données en mémoire. Cependant, il est nécessaire d'utiliser correctement le type de structure de données à utiliser. Sinon, le temps de traitement sera trop long pour une utilisation pratique. J'ai testé le temps de traitement de Python list / set / dictionary. → Tentative de temps de traitement de la structure des données (Extrait du texte Python: Text body / items / b465b0cf05b1b7fd4975)) -Exemples de programmes: spdTest00.py, spdTest01.py .py), spdTest02.py Si vous le traitez comme un tableau avec un index entier, la liste Python est rapide, mais vous ne pouvez pas rechercher d'éléments. Vous faites peut-être une "recherche linéaire". Lors de la recherche d'éléments, vous devez utiliser des ensembles et des dictionnaires.   ● Comparaison de la vitesse du programme en langage C avec / sans NumPy L'un des principaux objectifs de l'utilisation de Python est le traitement des données. De nombreuses bibliothèques pour la science des données et l'apprentissage automatique sont basées sur NumPy. Puisqu'il y a une telle situation, j'ai créé un programme pour trouver le produit des matrices et étudié la vitesse de NumPy. Comparaison de 3 programmes de calcul du produit de matrices (rapport PDF) (Extrait du texte Python: corps du texte) Programmes: matmult01.py, matmult01_np.py ), Matmult01.c Comparé au calcul du produit des matrices en utilisant une liste sous forme de tableau, NumPy est 10 000 fois plus rapide. Quand j'ai vu le rapport de vitesse, j'ai pensé: "Quelque chose ne va pas?" De plus, c'est plus de 30 fois plus rapide que d'écrire simplement en langage C. Dans ce cas, Python + NumPy est la victoire écrasante. __Note) __ C'est le cas de NumPy utilisant Intel MKL. Ce sera plus lent pour NumPy sans MKL. ** (Supplément) ** En particulier, les opérations matricielles NumPy sont rapides, et si le traitement que vous souhaitez réaliser peut être décrit comme des calculs matriciels, la vitesse d'exécution peut être grandement améliorée. (→ Rapport PDF: Exemple montrant la grande vitesse du produit des matrices NumPy) Ceci est un extrait de "Python3 Library Book".   (à suivre)

Ce qui est bien avec Python

■ Facilité d'apprentissage et fonctionnalité

Python est un langage convivial pour les débutants. Pourtant, c'est un langage hautement fonctionnel. Les gens qui ont appris la programmation C et Java à l'école peuvent en être parfaitement conscients, mais au début, ils n'ont aucun sens. Cela ne fonctionne que si vous écrivez beaucoup de "mots" qui n'ont rien à voir avec l'algorithme de base (idée de procédure) ... Nous, professeurs, expliquons des «mots» incompréhensibles comme «je n'ai pas à comprendre au début…» ou «je pense que c'est magique!   D'un autre côté, Python a très peu de "mots inintelligibles". Par exemple, même si vous faites de la première leçon "un programme qui affiche" Hello, World "" que vous faites souvent à l'école, il y a une grande différence entre Java et Python. Écrivons en fait des programmes Java et Python et comparons-les.   → Version Java "Hello, World" (5 lignes) → Version Python "Hello, World" (1 ligne)   Voici un exemple pour afficher «Hello, World» sur l'interface graphique.   → Version Java "Hello, World" (33 lignes: version JavaFX) → Version Python "Hello, World" (17 lignes: version Kivy) → Version Python "Hello, World" (8 lignes: version Tkinter)   Même avec juste cette leçon d'introduction, le nombre de lignes dans le programme est très différent. (Python est plus court) De plus, Python permet de nombreux styles d'écriture qui peuvent exprimer directement ce que vous voulez faire, et la productivité de la programmation est extrêmement élevée. (Apprenez Python pour plus d'informations) Dans le cas de C et Java, les traitements avancés qui doivent être beaucoup décrits sont préparés à l'avance en Python, et ils peuvent être appelés facilement. Je vous remercie.   C'est un sentiment d'enseigner sur le terrain.   Pour le moment, je vais l'expliquer pour éviter les malentendus, mais la signification de l'apprentissage du langage C est très grande. (L'interpréteur Python lui-même est écrit en C) La base du contrôle des appareils, la base de la gestion des ressources de stockage, la base des entrées / sorties, la base de la communication, la base de la gestion des processus ... C est inévitable lors de l'apprentissage des bases de l'ingénierie de l'information. (De plus, la plupart des systèmes d'exploitation tels que Windows, macOS et Linux sont écrits en C.)   Si vous apprenez Python, veuillez apprendre le langage C. Idéalement, vous devriez créer un module en C et le faire fonctionner à partir de Python. Il existe des options telles que Cython et Numba, mais je pense qu'il est très bon d'appeler une fonction écrite en langage C via ctypes.

■ Bibliothèque abondante

Je pense que la meilleure chose à propos de Python est l'abondance de bibliothèques. Même dans mon séminaire, j'ai pu répondre rapidement à l'élève (toujours en troisième année à cette époque) qui a dit: «Je voudrais essayer la reconnaissance d'image ...». Après cela, j'ai rapidement conçu les grandes lignes du produit et la thèse de fin d'études et rendu la recherche de fin d'études fructueuse (gagnant dans un concours techno). Bien sûr, l'étudiant n'est pas non plus doué pour la programmation. Avec C ++ et Java, il est impossible de répondre aux besoins des étudiants à cette vitesse. Python + OpenCV + Pillow gagne. Ne vous méprenez pas, Python lui-même est lent, mais divers packages sont souvent implémentés en C et sont très rapides. Un exemple frappant est que l'utilisation de Python + NumPy pour le traitement numérique est plus rapide (vitesse de développement et d'exécution) que d'écrire mal en C ou FORTRAN. Aussi, SymPy, scikit-learn, Keras, PyTorch, Chainer ... Des logiciels au niveau de "Puis-je publier ceci gratuitement?" Au moment où je suis entré dans le monde de Python, j'ai été surpris de sa richesse, "Qu'est-ce que c'est!" Et "Qu'est-ce que c'est?!". La perception que Python est un langage pour l'IA est également due à l'abondance de bibliothèques associées. Ceci est également trompeur, mais Python n'est pas à l'origine un langage pour l'IA. Cela signifie que les chercheurs en IA trouvent cela très pratique. Les bibliothèques telles que scicit-learn pour l'apprentissage automatique et Keras qui exploitent TensorFlow sont des bibliothèques standard dans le domaine de l'apprentissage automatique / AI, et «Python est un prérequis».

■ Programmation selon la structure des données

Les indices (tranches) attachés à des structures de données telles que les listes et les taples Python sont très expressifs et il est facile d'accéder à l'intérieur de la structure de données. En outre, une fois que vous vous êtes habitué à utiliser des fonctions telles que la carte et le filtre et les expressions lambda, vous pouvez programmer sous une forme qui reflète la structure des données telle qu'elle est. Si vous le faites bien, vous pouvez réduire la boucle de for et écrire le programme entier de manière concise, alors apprenez-le.

■ "Métaprogrammation" par eval et exec

Ceci est difficile à comprendre tant que vous n’avez pas maîtrisé la programmation, mais c’est un processus avancé que «les données peuvent être exécutées comme un programme». C'est une fonction qui peut exécuter des expressions et des instructions créées en tant que données de chaîne de caractères. (La fonction d'exécuter des données en tant que programme est une fonction indispensable pour la programmation basée sur l'IA.) C'est une affaire privée, mais je pense que Lisp n'est plus nécessaire pour les activités de recherche. (→ Correction: Après tout, Lisp est important)   Maintenant, pour moi, le langage nécessaire pour aborder les thèmes liés à l'IA est


écrit par Katsunori Nakamura

Recommended Posts

Prise en compte des forces et faiblesses de Python
L'histoire de Python et l'histoire de NaN
[Python] Forces et faiblesses de DataFrame en termes de temps requis
Connectez beaucoup de Python ou et et
[python] [meta] Le type de python est-il un type?
L'histoire du traitement A du blackjack (python)
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Récupérer l'appelant d'une fonction en Python
La réponse de "1/2" est différente entre python2 et 3
ffmpeg-Construisez un environnement python et divisez la vidéo
Spécification de la plage des tableaux ruby et python
le zen de Python
Copiez la liste en Python
Écrire une note sur la version python de python virtualenv
Comparez la vitesse d'ajout et de carte Python
[Python] Une compréhension approximative du module de journalisation
Sortie sous la forme d'un tableau python
[Python] Une compréhension approximative des itérables, des itérateurs et des générateurs
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
[Python] Un programme qui compte le nombre de vallées
L'histoire de Python sans opérateurs d'incrémentation et de décrémentation.
Découpez une partie de la chaîne à l'aide d'une tranche Python
Le processus d'installation d'Atom et de l'exécution de Python
Visualisez la gamme d'insertions internes et externes avec python
Implémentation python de la classe de régression linéaire bayésienne
Points Python du point de vue d'un programmeur en langage C
Une comparaison rapide des bibliothèques de test Python et node.js
Référence et modification de la limite supérieure récursive Python
J'ai vérifié les versions de Blender et Python
Un mémorandum sur la mise en œuvre des recommandations en Python
[Python] Un programme qui compare les positions des kangourous.
Note Python: Le mystère de l'attribution d'une variable à une variable
Vers la retraite de Python2
À propos des fonctionnalités de Python
Installation source et installation de Python
Le pouvoir des pandas: Python
[Python3] Prenez une capture d'écran d'une page Web sur le serveur et recadrez-la davantage
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
[Python] Changer la couleur du texte et la couleur d'arrière-plan d'un mot clé spécifique dans la sortie d'impression
Découvrez la largeur apparente d'une chaîne en python
Une implémentation Python simple de la méthode k-voisinage (k-NN)
[Python] Fonctionnalisation de la formule de Heron et calcul de la surface maximale
Différent du type d'importation de python. Signification de depuis A import B
Obtenez le nombre d'éléments spécifiques dans la liste python
[Note] Importation de fichiers dans le répertoire parent en Python
Créer un environnement Python et transférer des données vers le serveur
Le processus de création et d'amélioration du code Python orienté objet
Un résumé approximatif des différences entre Windows et Linux
Le websocket de toio (nodejs) et python / websocket ne se connecte pas.
Je veux connaître la nature de Python et pip
[Astuces] Problèmes et solutions dans le développement de python + kivy
Trouver les valeurs propres d'une vraie matrice symétrique en Python
[Python3] "A // B" et "math.floor (A / B)" ne sont pas toujours les mêmes! ??
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Script Python qui compare le contenu de deux répertoires