Python >> Tutoriel Python >  >> Python

Allez allez Python Rangers ! Comparer Python et Golang

Go (également connu sous le nom de Golang) est génial !

Laissez-moi vous expliquer pourquoi un fan de Python depuis de nombreuses années penserait cela, en particulier avec la concurrence entre Python et les autres langages de programmation qui est aussi féroce qu'elle l'est.

Au cours du processus, vous apprendrez laquelle des deux langues conviendra le mieux à votre projet. Ou peut-être y a-t-il une troisième voie qui vous offrira le meilleur des deux mondes ?

Pour vous montrer ce que je veux dire, nous allons faire un petit voyage dans le passé et découvrir comment ma fascination pour Python a commencé.

Mon histoire Python :le coup de foudre

Revenons à l'année 2002, lorsque la plupart des gens utilisaient des modems 56 kbps pour discuter sur AIM ou Gadu-Gadu et télécharger des MP3 depuis Kazaa ou eMule. Je venais de commencer des études d'informatique et j'ai vu Linux pour la première fois.

J'étais émerveillé comme un enfant dans une confiserie. Vous pouviez faire tellement plus sous Linux que dans l'ancien Windows 98 que j'avais à l'époque. J'ai donc voulu l'installer sur mon propre ordinateur à la maison.

J'ai utilisé mon argent de poche pour acheter Linux Magazine avec le CD d'installation de Red Hat 7.3. Imaginez ma déception lorsqu'au milieu de l'installation, le lecteur de CD a commencé à ralentir et s'est finalement arrêté.

C'est alors que j'ai vu Python traceback pour la première fois. Je pense que c'était une IOError car le CD était corrompu et n'a pas pu charger certains fichiers.

J'étais triste. J'ai essayé de l'installer encore et encore. À chaque fois, la même exception apparaissait.

Une fonctionnalité cassée dans un logiciel open source… ce n'est pas un problème, c'est un défi :)

Heureusement, Traçage Python affiche les noms de fichiers et les numéros de ligne. J'ai donc pu facilement trouver où se trouvait l'erreur dans le code source d'Anaconda, le programme d'installation de Red Hat écrit en Python.

Lorsque j'ai ouvert le fichier .py, j'ai été surpris de pouvoir le lire. Je pourrais même le comprendre sans jamais avoir lu un tutoriel de Python. À cette époque, je ne savais programmer qu'en C++ et Pascal, mais apprendre cela m'a demandé beaucoup de travail.

Pour finir l'histoire, je dois me vanter d'avoir modifié le programme d'installation pour omettre les fichiers corrompus et j'ai enfin pu utiliser Linux à la maison. La lisibilité et la flexibilité de Python m'ont tellement impressionné que ce jour-là, je suis devenu un fan de Python pour la vie.

"Ce n'est pas un problème, c'est un défi" :comment j'ai découvert Golang

Il y a quelques mois, j'ai déménagé dans une autre ville pour ouvrir un nouveau bureau STX Next. Dans mon appartement nouvellement loué à Gdansk, je n'ai plus de smart TV. Ce n'est pas si mal car Kodi, un lecteur multimédia gratuit et open source fonctionnant sur mon Raspberry Pi 3, est un très bon remplacement.

Malheureusement, la fonction Link TV and Phone est manquante dans le module complémentaire YouTube de Kodi. (Si vous n'avez pas encore utilisé cette fonctionnalité, je vous recommande vivement de l'essayer.)

Une fonctionnalité manquante dans les logiciels open source... ce n'est pas un problème, c'est un défi !

J'avais entendu dire que les modules complémentaires de Kodi étaient écrits en Python, alors j'ai pensé que ce serait facile. Le processus d'appairage du téléviseur et du téléphone est assez simple et bien documenté (protocole DIAL) et il existe même des implémentations Python (par exemple xbmc-dial).

Mais l'échange de commandes entre appareils couplés n'est pas un jeu d'enfant. Étonnamment, Google n'a publié aucune documentation.

Après une longue recherche, j'ai finalement trouvé plaincast, un outil écrit en Go qui lit uniquement le son des vidéos YouTube. Lorsque j'ai ouvert le fichier .go, j'ai été surpris de pouvoir le lire. Plus important encore, je pouvais le comprendre sans même lire un tutoriel de Go.

Je l'ai donc pris comme base et j'ai créé kodicast, un service autonome qui se situe entre YouTube et Kodi. Comme vous pouvez le voir dans l'historique des commits, cela ne m'a pris qu'environ 24 heures au total.

Ce n'est pas mal, surtout si vous considérez que j'ai dû me familiariser avec deux protocoles différents et apporter des modifications à un programme écrit dans un langage dont je n'avais entendu parler que.

Comparaison de Golang et Python :performances, productivité et rapidité

Malgré mon histoire, passons à la comparaison de Python et Go.

Performances d'exécution

Tout d'abord, concentrons-nous sur les performances telles qu'elles sont généralement comprises :les performances à l'exécution. Quelle langue s'exécute plus rapidement ?

Il n'y a pas deux façons de le dire :Go s'exécute plus rapidement que Python, dans certains cas d'utilisation, même 30 fois plus rapidement.

Dans les benchmarks de langage informatique, Go termine le mandelbrot test 48x plus rapide, spectral-norm 43x plus rapide et n-body 38 fois plus rapide.

La prise en charge intégrée de Golang pour la simultanéité lui permet également de terminer les calculs plus rapidement par rapport à Python.

Mais pour de nombreux cas d'utilisation, les performances d'exécution peuvent ne pas être très importantes car très souvent, la langue n'est que le ciment entre l'application et la base de données.

Ce qui nous amène à une autre façon de penser la performance.

Productivité des développeurs

Les performances d'exécution peuvent être importantes pour certaines applications, mais il existe une autre mesure qui s'applique à tout projet logiciel :la productivité de vos développeurs.

En fin de compte, vous souhaitez respecter les délais de votre projet et mettre votre code en ligne là où il peut profiter aux utilisateurs finaux. Pour la plupart des applications, cela sera plus important que l'exécution d'une fonction en 10 ms ou 100 ms.

Alors, quelle équipe de développement obtiendra des résultats plus rapides, une travaillant avec Python ou une travaillant avec Go ?

La réponse évidente est "cela dépend", mais regardons de plus près quels aspects de Python et Go influenceront les résultats.

L'avantage de Python :des tonnes de frameworks et de bibliothèques

Python est bien connu pour sa riche sélection de frameworks et ses tonnes de bibliothèques utiles, aidant les développeurs à démarrer n'importe quel projet beaucoup plus rapidement.

Des offres "piles incluses" comme Django à des frameworks plus "minimalistes mais extensibles" comme Flask, Python donnera à vos équipes de développement un bon départ dans presque toutes les situations.

C'est encore mieux quand on regarde la liste légendaire de bibliothèques de Python :

  • Numpy pour la gestion des tableaux et les fonctions matricielles complexes,
  • Tensorflow et scikit-learn pour l'apprentissage en profondeur,
  • OpenCV pour le traitement d'images,
  • Pandas pour l'analyse des données,
  • matplotlib pour la visualisation,
  • et la liste continue.

Étant une langue plus jeune, Golang n'a pas encore eu le temps d'accumuler une offre aussi impressionnante de solutions prédéfinies.

Mais cela ne veut pas dire que Golang n'a rien à offrir. Voici quelques exemples de frameworks Golang :

  • Gin (actuellement le plus populaire avec 26 000 étoiles sur GitHub),
  • Écho (13 000 étoiles),
  • Revel (11 000 étoiles).
L'avantage de Golang :la simplicité

Sur le blog de stream.io, Thierry Schellenbach explique pourquoi Stream est passé de Python à Go. L'une des raisons était que Go offre une certaine simplicité, il ne vous permet pas d'être aussi "créatif" avec le code que vous écrivez.

En Python, le cas est plutôt le contraire. Par exemple, avec Python, vous pouvez :

  • utiliser les métaclasses pour auto-enregistrer les classes lors de l'initialisation du code ;
  • échanger Vrai et Faux ;
  • ajouter des fonctions à la liste des fonctions intégrées ;
  • surcharger les opérateurs via des méthodes magiques ;
  • utiliser les fonctions comme propriétés via le décorateur @property.

La question est :avez-vous besoin de ces fonctionnalités avancées pour fournir un code fonctionnel ?

Dans la plupart des cas, vous ne le faites pas. Et c'est à l'avantage de Golang.

Les développeurs Go restent simples - ils n'ont presque pas d'autre choix - afin que leur code soit plus facile à comprendre lorsqu'il change de mains. Et lorsque les programmeurs peuvent comprendre le travail des autres en un coup d'œil, ils peuvent apporter des modifications plus rapidement et la productivité augmente.

Python vs. Go :syntaxe, structure et philosophie

En termes de syntaxe, de structure et de philosophie, voici le moyen le plus court de comparer Python et Go :

idem…

Il existe certaines similitudes entre Go et Python. Vous pouvez trouver une certaine ressemblance entre les types de haut niveau :tranches et cartes sont comme des listes et dicts , mais avec un typage statique. La gamme de Go fonctionne comme énumérer de Python . Et c'est tout.

…mais différent…

Les différences entre les deux langues sont beaucoup plus nombreuses. Certains d'entre eux peuvent être choquants pour un développeur Python. Par exemple, dans Go, il n'y a pas de try-except . Au lieu de cela, Go permet aux fonctions de renvoyer un type d'erreur en plus d'un résultat.

// getUUID returns a stable UUID based on the first MAC address
func getUUID() (*uuid.UUID, error) {
    itfs, err := net.Interfaces()
    if err != nil {
        return nil, err
    }
    // get the first interface with a MAC address
    for _, itf := range itfs {
        if len(itf.HardwareAddr) == 0 {
            continue
        }
        id := []byte(itf.HardwareAddr.String() + "-" + NAME)
        return uuid.NewV5(uuid.NamespaceOID, id)
    }
    return nil, errors.New("could not find interface with MAC address")
}

Ainsi, lorsque vous utilisez une fonction, vous devez d'abord vérifier si une erreur a été renvoyée ou non.

deviceUUID, err := getUUID() if err != nil { logger.Fatal(err) }

Le typage statique est une autre chose à laquelle vous devez vous habituer. Bien sûr, il existe des situations où vous ne pouvez pas être complètement sûr du type de données. Pour de telles situations, Go propose une interface vide (interface{} ). Il peut contenir des valeurs de n'importe quel type, mais lorsque vous souhaitez l'utiliser (par exemple, effectuer des opérations dessus), vous devez utiliser l'assertion de type pour obtenir la valeur sous-jacente.

À titre d'exemple, examinons l'analyse de certaines données JSON.

func (kodi *Kodi) getPlayerId() (int) {
    resp, err := kodi.sendCommand("Player.GetActivePlayers", nil)
    if err != nil {
        return -1
    }
    // resp is a JSON [{"type":"video","playerid":0}]
    result := resp.([]interface{})
    for _, i := range result {
        // a map with string keys but values can be a string or a number
        // so we have to use empty interface as a value type
        item := i.(map[string]interface{})
        playerType := item["type"].(string)
        if playerType == "video" {
            return int(item["playerid"].(float64))
        }
    }
    return -1
}

Il y a quelques autres nouveautés Go que les développeurs Python devront apprendre, tels que :

  • pointeurs
  • fermeture
  • structures (types composés)
  • goroutines (concurrence confortable)
  • canaux (envoyer des messages entre goroutines)
  • méthodes (Go n'a pas de classes, mais vous pouvez définir des méthodes sur les types)
  • différer (remplacement de try-finally)
…mais toujours pareil

Alors pourquoi les développeurs Python peuvent-ils comprendre Go si facilement ? Je pense que c'est parce que la conception de Go suit des principes similaires.

Comparons les principes directeurs de Go et le Zen de Python. Dans les deux langues, réduire l'encombrement et la complexité est une priorité.

La règle de syntaxe propre de Go conduit à une lisibilité élevée, qui est si appréciée par les Pythonistas (Readability counts dans le Zen de Python). De plus, l'orthogonalité de Go, une tendance à conserver un ensemble relativement petit de blocs de construction de base, favorise la simplicité plutôt que la complexité (Simple vaut mieux que complexe ). Le typage statique est également cohérent avec la règle d'explicitation (Explicit vaut mieux qu'implicite ).

Comparaison supplémentaire entre Go et Python :tendances et prévisions futures

Enfin, jetons un coup d'œil à ce que l'avenir peut réserver aux deux langues. Il semble être brillant pour les deux.

Au premier trimestre 2019, Python était le deuxième langage de programmation le plus rapide sur GitHub en termes de demandes d'extraction (+17 %), mais Golang était sur ses talons au quatrième rang (+8 %).

Les résultats d'une récente enquête publiée sur le blog Go donnent également un aperçu de la croissance de Golang :

  • En 2018, pour la première fois, la moitié des personnes interrogées utilisaient Go dans le cadre de leur routine quotidienne.
  • Le nombre de personnes interrogées qui utilisent Go dans le cadre de leur travail a également augmenté de manière significative.
  • Par rapport à 2017, le nombre de répondants qui "programment en Go au travail et en dehors du travail" est passé de 36 % à 46 %.
  • 16 % des personnes interrogées utilisent Go depuis plus de 4 ans (contre 13 % en 2017 et 9 % en 2016), ce qui signifie que les développeurs n'abandonnent pas l'écosystème après avoir initialement appris le langage.
  • Il est intéressant de noter que la deuxième langue de préférence des répondants (après Go) était majoritairement Python.

Pourquoi Python se développe-t-il ? Les raisons sont bien connues :

  • Python est extrêmement productif grâce aux nombreuses bibliothèques et frameworks existants.
  • En tant que langage de haut niveau, Python est facilement lisible, ce qui facilite la collaboration des équipes de développement.
  • Python a une communauté très active ; si vous rencontrez un problème dans votre projet, une solution bien documentée existe probablement déjà pour Python.
  • Python est un choix de premier ordre pour le machine learning et la science des données, qui sont tous deux extrêmement populaires en ce moment.
  • Python est accessible et constitue un excellent langage pour les débutants ; de nombreux développeurs commencent simplement et restent avec le langage.
  • C'est parfait pour les startups, car Python est idéal pour créer rapidement des MVP et des prototypes.
  • Dans le contexte de l'entreprise, il est fiable et permet d'obtenir des résultats commerciaux plus rapidement.
  • Le plus souvent, ses performances plus lentes n'ont pas d'importance.

Et pourquoi Golang est-il en hausse ? C'est peut-être parce que :

  • Le langage est développé par Google, ce qui aide toujours.
  • La simplicité de Go en fait un outil idéal pour optimiser la productivité et la lisibilité des développeurs.
  • La saisie statique facilite la détection des bogues.
  • Go est bien adapté aux architectures de microservices d'aujourd'hui.
  • Go devient de plus en plus populaire dans le domaine de la science des données, car il associe performances globales et possibilité de "passer de l'ordinateur portable de l'analyste à la production complète".
  • C'est open source.
  • Il possède une grande bibliothèque de guides officiels.
  • Il se compile rapidement.
  • Il fonctionne très bien en termes d'efficacité du processeur/multithreading et de la mémoire.
  • Dans l'enquête susmentionnée, 68 % des personnes interrogées sont "susceptibles de recommander Go à un ami ou à un collègue", il est donc probable que cela se propage comme une traînée de poudre.

Cependant, il existe toujours un gouffre important en termes de popularité entre les deux langues. Jetez un coup d'œil aux tendances Google des cinq dernières années :

Dans l'ensemble, les deux langues sont à la hausse et les deux feraient un choix productif pour votre projet logiciel, bien que de manière différente. Python reste l'option la plus mature avec une meilleure sélection de bibliothèques et de frameworks, mais Go offre des performances et une simplicité attrayantes.

"Et ne me forcez jamais à choisir, car je risque de faire un mauvais choix."

De nombreux CTO et architectes logiciels doivent choisir un langage de programmation lorsqu'ils démarrent un nouveau projet ou créent une startup. Python est très bon pour le web et la science des données. Cependant, Go est beaucoup plus rapide en termes de performances que n'importe quel langage interprété tel que Python.

Pour citer Happysad, mon groupe préféré, "Ne me fais jamais choisir, car je pourrais faire un mauvais choix." Dans ce cas, je pense que vous n'avez pas à choisir.

À mon avis, utiliser à la fois Python et Go serait un mélange puissant. Vous pouvez utiliser Go pour écrire le code pour lequel les performances sont essentielles, puis utiliser Python pour le reste. Une architecture de microservices ou même une approche sans serveur est probablement la meilleure façon de mélanger Go et Python.

Allez les Rangers Python ! Réflexions finales sur Golang contre Python

Les principes de conception similaires de Go et Python rendent la transition de Python à Go assez agréable. J'espère voir plus de projets qui mélangent Python et Go.

Donc, si vous êtes un Python Ranger, pourquoi ne pas essayer Go ?

Alternativement, vous pouvez également découvrir comment Python se compare à Node.js ou Java.