[GO] J'ai essayé Grumpy (allez exécuter Python).

introduction

"Il évolue beaucoup" ou quelque chose que vous écrivez bien. J'ai été impressionné par les nouvelles ci-dessous, alors j'ai décidé d'essayer Grumpy (Go running Python). My Navi News: Google développe un environnement d'exécution Python très évolué avec Go

Lisez le blog original.

Je pense que le blog original a été extrait pour créer la rubrique "Très grande échelle", alors lisons également le blog original (ancien blog) en diagonale. ..

https://opensource.googleblog.com/2017/01/grumpy-go-running-python.html

À propos de l'évolutivité élevée dans le benchmark Fib

Description 《Very Scale》: «Grumpy» est encore au stade expérimental, mais il est hautement évolutif dans le benchmark Fib par rapport à CPython.

=> Description sur le blog d'origine.

In particular, Grumpy has no global interpreter lock, and it leverages Go’s garbage collection for object lifetime management instead of counting references. We think Grumpy has the potential to scale more gracefully than CPython for many real world workloads. Results from Grumpy’s synthetic Fibonacci benchmark demonstrate some of this potential:

Pour Global Interpreter Lock (GIL), voir [Japanese wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AD%E3%83%BC% E3% 83% 90% E3% 83% AB% E3% 82% A4% E3% 83% B3% E3% 82% BF% E3% 83% 97% E3% 83% AA% E3% 82% BF% E3% 83% AD% E3% 83% 83% E3% 82% AF) est également facile à comprendre. La combinaison de Python et de code C non thread-safe signifie que le verrouillage par processus limite l'évolutivité. Les résultats de référence publiés dans le blog original sont les suivants.

Grumpy est plus lent pour les threads simples, mais vous pouvez voir que la puissance de traitement évolue linéairement pour les threads multiples. Cependant, ce résultat est dû à l'arrêt du support des modules d'extension Python et C.

(Blog original) Tout d'abord, nous avons décidé de renoncer à la prise en charge des modules d'extension C. Cela signifie que Grumpy ne peut pas tirer parti de la richesse des extensions Python C existantes, mais cela nous a donné beaucoup de flexibilité pour concevoir une API et une représentation d'objets qui s'adaptent aux charges de travail parallèles ..

À propos de l'écosystème Grumpy

Je pensais que la description suivante était assez trompeuse, alors vérifions la situation réelle.

Description en << Very Scale >>: Go a été initialement développé dans le but d'obtenir des performances élevées en traitement parallèle, et est bon pour le traitement parallèle. Il semble que Grumpy a encore besoin de temps de développement en termes de compatibilité, mais Grumpy, qui démontre des performances élevées en multi-core / processeur, pourrait être utilisé comme un environnement d'exécution Python très important à l'avenir.

Ancien blog =>

Second, Grumpy is not an interpreter. Grumpy programs are compiled and linked just like any other Go program. ... the biggest advantage is that interoperability with Go code becomes very powerful and straightforward: Grumpy programs can import Go packages just like Python modules! (Je dis): Les programmes grincheux générés à partir de Python sont compilés et liés comme n'importe quel autre programme Go ... Le plus grand avantage de ceci est l'interopérabilité avec Go. Les programmes grincheux peuvent importer des packages Go comme les modules Python.

Grumpy n'avait probablement pas l'intention d'exécuter du code python existant sur Go lorsqu'il a renoncé à appeler du code C. Je pense que le développement futur autour de Grumpy ne sera pas dans le sens d'exécuter des frameworks Python existants tels que Django, mais dans le sens de faciliter la combinaison des bibliothèques Go et du code Python.

Essayez d'exécuter Grumpy.

Je voulais savoir quel code Grumpy crache, alors j'ai essayé de lancer Grumpy. Le code original ressemble à ceci.

benchmark1.py


#-*- using:utf-8 -*-
import time
if __name__ == '__main__':
    start = time.time()
    for i in range(1,50):
        print (i, 100.0 / (i * i * i ))
    elapsed_time = time.time() - start
    print ("------- result ------")
    print (elapsed_time * 1000 , "ms")

Le temps d'exécution en Cpython est d'environ 1,3 ms.

$ python benchmark1.py (1, 100.0) (2, 12.5) .. (Omis) .. (49, 0.0008499859752314087) ------- result ------ (1.3232231140136719, 'ms')

Présentez Grumpy. Pour Linux (ubuntu16.04) avec Go, python et gcc, il était facile de déployer comme indiqué par le site github.

git clone https://github.com/google/grumpy cd grumpy make export GOPATH=PWD/build export PYTHONPATH=PWD/build/lib/python2.7/site-packages tools/grumpc benchmark1.py > benchmark1.go go build benchmark1.go

Essayez d'exécuter le binaire benchmark1 créé à partir de benchmark1.go.

$ ./benchmark1 (1, 100) (2, 12.5) .. (Omis) .. (49, 0.0008499859752314087) ------- result ------ (5.621671676635742, 'ms')

... comme prévu, cela prend plus de temps que Cpython.

Le code source de Go généré par Grumpy est long, je vais donc le mettre ci-dessous. À ce stade, cela ne semble pas être quelque chose que les humains devraient lire. ..

https://gist.github.com/kmry/906a8154a37bb0060d35eee20a3e06ca

Si tu es intéressé ...

Si vous êtes intéressé par le code python sur Go by grumpy, je pense que c'est une bonne idée de regarder d'abord le code sur github. L'implémentation Go compatible avec la bibliothèque standard python est également avancée dans une certaine mesure.

Par exemple, si vous regardez le module de temps utilisé pour mesurer le temps d'exécution ci-dessus, https://github.com/google/grumpy/search?q=time

Vous pouvez voir que l'implémentation est encapsulée dans la bibliothèque standard de Go, comme indiqué ci-dessous.

grumpy/lib/time.py


"""Time access and conversions."""

from __go__.time import Now, Second, Sleep  # pylint: disable=g-multiple-import


def sleep(secs):
  Sleep(secs * Second)


def time():
  return float(Now().UnixNano()) / Second

Si une "personne wow" apparaît comme une extension de ces efforts, un framework compatible WAF pour Python peut apparaître sur grumpys. # Non garanti :)

Une fois qu'un peu plus d'informations sont disponibles, il peut être amusant d'écrire un traitement parallèle en utilisant la bibliothèque go en python.

Recommended Posts

J'ai essayé Grumpy (allez exécuter Python).
J'ai essayé d'exécuter faiss avec python, Go, Rust
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé d'exécuter pymc
J'ai essayé Python> autopep8
J'ai essayé Python> décorateur
J'ai essayé d'exécuter TensorFlow
J'ai essayé d'exécuter python -m summpy.server -h 127.0.0.1 -p 8080
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
J'ai essayé d'exécuter alembic, un outil de migration pour Python
J'ai essayé de gratter avec Python
J'ai essayé l'extension C de Python
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé LeetCode tous les jours 7. Integer Integer (Python, Go)
J'ai essayé d'exécuter python à partir d'un fichier chauve-souris
J'ai essayé LeetCode tous les jours 20. Parenthèses valides (Python, Go)
[Python] J'ai essayé d'exécuter un serveur local en utilisant flask
J'ai essayé LeetCode tous les jours 9. Palindrome Number (Python, Go)
J'ai essayé LeetCode tous les jours 1. Two Sum (Python, Go)
J'ai essayé de toucher Python (installation)
J'ai essayé LeetCode tous les jours 13. Roman to Integer (Python, Go)
J'ai essayé webScraping avec python.
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
J'ai essayé d'exécuter GAN dans Colaboratory
J'ai essayé LeetCode tous les jours 14.Le plus long préfixe commun (Python, Go)
J'ai essayé la notification de ligne en Python
J'ai essayé la communication SMTP avec Python
J'ai essayé d'exécuter le référentiel de packages Python (entrepôt) qui prend en charge PyPI
J'ai essayé LeetCode tous les jours 21. Fusionner deux listes triées (Python, Go)
J'ai essayé d'implémenter la permutation en Python
Livre Wrangle x Python Je l'ai essayé [2]
J'ai essayé d'implémenter PLSA dans Python 2
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé d'utiliser l'optimisation bayésienne de Python
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
J'ai essayé d'implémenter PPO en Python
Python: j'ai essayé le problème du voyageur de commerce
Livre Wrangle x Python Je l'ai essayé [1]
Mayungo's Python Learning Episode 8: J'ai essayé l'entrée
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai essayé de gratter la météo Yahoo (édition Python)
J'ai essayé de toucher Python (syntaxe de base)
J'ai essayé le framework de test Python Tornado
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé de gratter
J'ai essayé PyQ