[GO] Ich habe es mit Grumpy versucht (Python ausführen).

Einführung

"Es skaliert sehr" oder etwas, das Sie gut schreiben. Ich war beeindruckt von den folgenden Neuigkeiten und habe mich daher entschlossen, Grumpy (Go running Python) auszuprobieren. Meine Navi-Nachrichten: Google entwickelt mit Go eine sehr skalierte Python-Ausführungsumgebung

Lesen Sie den Original-Blog.

Ich habe das Gefühl, dass das ursprüngliche Blog extrahiert wurde, um die Überschrift "Sehr skaliert" zu erstellen. Lesen wir also auch das ursprüngliche Blog (ehemaliges Blog) diagonal. ..

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

Über hohe Skalierbarkeit im Fib-Benchmark

《Very Scale》 Beschreibung: „Grumpy“ befindet sich noch im experimentellen Stadium, ist jedoch im Fib-Benchmark im Vergleich zu CPython hoch skalierbar.

=> Beschreibung im Originalblog.

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:

Informationen zur globalen Interpreter-Sperre (GIL) finden Sie unter Japanische Wikipedia 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) ist ebenfalls leicht zu verstehen. Die Kombination von Python und nicht threadsicherem C-Code bedeutet, dass das Sperren pro Prozess die Skalierbarkeit einschränkt. Die im ursprünglichen Blog veröffentlichten Benchmark-Ergebnisse lauten wie folgt.

Grumpy ist für einzelne Threads langsamer, aber Sie können sehen, dass die Verarbeitungsleistung für mehrere Threads linear skaliert. Dieses Ergebnis ist jedoch auf die Einstellung der Unterstützung für Python- und C-Erweiterungsmodule zurückzuführen.

(Original-Blog) Zuerst haben wir beschlossen, auf die Unterstützung für C-Erweiterungsmodule zu verzichten. Dies bedeutet, dass Grumpy die Fülle der vorhandenen Python C-Erweiterungen nicht nutzen kann, aber es gab uns viel Flexibilität beim Entwerfen einer API- und Objektdarstellung, die für parallele Workloads skalierbar ist ..

Über das mürrische Ökosystem

Ich fand die folgende Beschreibung ziemlich irreführend, also lasst uns die tatsächliche Situation überprüfen.

Beschreibung in << Very Scale >>: Go wurde ursprünglich mit dem Ziel entwickelt, eine hohe Leistung bei der Parallelverarbeitung zu erzielen, und ist gut in der Parallelverarbeitung. Es scheint, dass Grumpy im Hinblick auf die Kompatibilität noch Entwicklungszeit benötigt, aber Grumpy, das eine hohe Leistung in Multi-Core / Prozessor demonstriert, kann in Zukunft als äußerst wichtige Python-Ausführungsumgebung verwendet werden.

Ehemaliger 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! (Ich sage): Mürrische Programme, die aus Python generiert wurden, werden wie jedes andere Go-Programm kompiliert und verknüpft ... Der größte Vorteil davon ist die Interoperabilität mit Go. Mürrische Programme können Go-Pakete genau wie Python-Module importieren.

Grumpy hatte wahrscheinlich nicht vor, vorhandenen Python-Code auf Go auszuführen, als er aufgab, C-Code aufzurufen. Ich denke, dass die zukünftige Entwicklung um Grumpy nicht darauf abzielen wird, vorhandene Python-Frameworks wie Django auszuführen, sondern darauf, die Kombination von Go-Bibliotheken und Python-Code zu vereinfachen.

Versuchen Sie, Grumpy auszuführen.

Ich wollte wissen, welchen Code Grumpy ausspuckt, also habe ich versucht, Grumpy auszuführen. Der ursprüngliche Code sieht so aus.

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")

Die Ausführungszeit in Cpython beträgt ca. 1,3 ms.

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

Stellen Sie Grumpy vor. Für Linux (ubuntu16.04) mit Go, Python und gcc war die Bereitstellung gemäß den Anweisungen der Github-Site einfach.

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

Versuchen Sie, die aus Benchmark1.go erstellte Benchmark1-Binärdatei auszuführen.

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

... wie erwartet dauert es länger als Cpython.

Der von Grumpy generierte Go-Quellcode ist lang, daher werde ich ihn unten einfügen. An diesem Punkt scheint es nicht etwas zu sein, das Menschen lesen sollten. ..

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

Wenn Sie interessiert sind ...

Wenn Sie sich für den Python-Code auf Go by mürrisch interessieren, ist es meiner Meinung nach eine gute Idee, sich zuerst den Code auf Github anzusehen. Die mit der Python-Standardbibliothek kompatible Go-Implementierung wurde in gewissem Umfang ebenfalls weiterentwickelt.

Wenn Sie sich beispielsweise das Zeitmodul ansehen, mit dem die Ausführungszeit oben gemessen wurde, https://github.com/google/grumpy/search?q=time

Sie können sehen, dass die Implementierung in die Standardbibliothek von Go eingebunden ist, wie unten gezeigt.

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

Wenn eine "Wow-Person" als Erweiterung dieser Bemühungen angezeigt wird, wird möglicherweise ein WAF-kompatibles Framework für Python auf Grumpys angezeigt. #Ungarantiert :)

Nachdem ein wenig mehr Informationen verfügbar sind, kann es Spaß machen, Parallelverarbeitung mit der go-Bibliothek in Python zu schreiben.

Recommended Posts

Ich habe es mit Grumpy versucht (Python ausführen).
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe versucht, Pymc auszuführen
Ich habe Python> autopep8 ausprobiert
Ich habe Python> Decorator ausprobiert
Ich habe versucht, TensorFlow auszuführen
Ich habe versucht, Python -m summpy.server -h 127.0.0.1 -p 8080 auszuführen
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Ich habe versucht, alembic auszuführen, ein Migrationstool für Python
Ich habe versucht, mit Python zu kratzen
Ich habe die C-Erweiterung von Python ausprobiert
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe jeden Tag LeetCode ausprobiert. 7. Reverse Integer (Python, Go)
Ich habe versucht, Python aus einer Bat-Datei auszuführen
Ich habe jeden Tag 20 LeetCode ausprobiert. Gültige Klammern (Python, Go)
[Python] Ich habe versucht, einen lokalen Server mit flask auszuführen
Ich habe jeden Tag LeetCode 9 ausprobiert. Palindrome Number (Python, Go)
Ich habe jeden Tag LeetCode ausprobiert. 1. Zwei Summen (Python, Go)
Ich habe versucht, Python zu berühren (Installation)
Ich habe jeden Tag 13 LeetCode ausprobiert. Roman to Integer (Python, Go)
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe versucht, GAN in Colaboratory auszuführen
Ich habe jeden Tag LeetCode ausprobiert. 14. Längstes allgemeines Präfix (Python, Go)
Ich habe Line Benachrichtigung in Python versucht
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, das Python Package Repository (Warehouse) auszuführen, das PyPI unterstützt
Ich habe jeden Tag LeetCode 21 ausprobiert. Zwei sortierte Listen zusammenführen (Python, Go)
Ich habe versucht, Permutation in Python zu implementieren
Wrangle x Python Buch Ich habe es versucht [2]
Ich habe versucht, PLSA in Python 2 zu implementieren
Python3-Standardeingabe habe ich versucht zusammenzufassen
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Ich habe versucht, PPO in Python zu implementieren
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Wrangle x Python Buch Ich habe es versucht [1]
Mayungos Python Learning Episode 8: Ich habe versucht, Eingaben zu machen
[Python] Ich habe versucht, TF-IDF stetig zu berechnen
Ich habe versucht, Yahoo Wetter zu kratzen (Python Edition)
Ich habe versucht, Python zu berühren (grundlegende Syntax)
Ich habe das Python Tornado Testing Framework ausprobiert
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht zu kratzen
Ich habe PyQ ausprobiert