Go von Python aufrufen: Python mit Go beschleunigen
Grace Collins
Solutions Engineer · Leapcell

Kombinieren von Python und Go: Nutzung dynamischer Linkbibliotheken zur Verbesserung der Entwicklungs- und Berechnungseffizienz
In der heutigen Softwareentwicklungslandschaft sind sowohl Python als auch Go sehr beliebte Programmiersprachen, die jeweils einzigartige Vorteile besitzen. Python ist bekannt für seine prägnante und elegante Syntax sowie seine umfangreichen Bibliotheken, die die Entwicklungseffizienz erheblich steigern. Es wird häufig in Bereichen wie Data Science, künstliche Intelligenz und Web Scraping eingesetzt. Auf der anderen Seite ist die Go-Sprache eine statisch typisierte und kompilierte Sprache. Sie bietet eine ausgezeichnete nebenläufige Leistung und eine hohe Laufzeit-Effizienz und wird oft für den Aufbau von hochleistungsfähigen Netzwerkdiensten, verteilten Systemen und Systemprogrammierungsszenarien verwendet.
Bei der Entwicklung komplexer Projekte wollen wir oft die Stärken dieser beiden Sprachen voll ausschöpfen. Zum Beispiel können wir den komplexen Berechnungsteil mit Go entwickeln, ihn in eine Dynamic-Link-Library kompilieren und ihn dann in Python aufrufen. Auf diese Weise können wir die Entwicklungskomfort von Python nutzen und auch die effizienten Rechenfähigkeiten von Go nutzen, wodurch wir das Ziel erreichen, die Entwicklungseffizienz und die Berechnungsgeschwindigkeit zu verbessern.
Einführung in Dynamic-Link-Libraries
Eine Dynamic-Link Library (DLL kurz) Datei ist eine nicht ausführbare binäre Programmdatei. Ihre Hauptfunktion besteht darin, es laufenden Programmen zu ermöglichen, den Code und die Ressourcen zu teilen, die für die Ausführung bestimmter Aufgaben erforderlich sind. Dynamic-Link-Libraries haben unterschiedliche Dateiendungen in verschiedenen Betriebssystemen. Im Windows-Betriebssystem enden Dynamic-Link-Libraries oft mit der Erweiterung .dll
; während im Linux-System Dynamic-Link-Libraries typischerweise mit der Erweiterung .so
enden.
Das Prinzip der dynamischen Verknüpfung besteht darin, DLL-Dateien aus gemeinsam genutztem Code zu erstellen. Wenn eine ausführbare Datei eine Funktion in einer DLL-Datei aufruft, lädt das Windows-Betriebssystem die DLL-Datei in den Speicher. Die Struktur einer DLL-Datei selbst ist eine ausführbare Datei, und die Funktionen werden erst dann verknüpft, wenn das Programm sie benötigt. Durch diese dynamische Verknüpfungsmethode kann die Situation der Speicherplatzverschwendung stark reduziert werden. Im Gegensatz dazu verknüpft die statische Verknüpfung den benötigten Code direkt mit der ausführbaren Datei. Der ursprüngliche Designzweck von DLLs war es, den von Anwendungsprogrammen benötigten Festplatten- und Speicherplatz zu sparen.
Go Code Beispiel
Hier präsentieren wir ein einfaches Go Codebeispiel. Speichern Sie es als die Datei add.go
:
package main import "C" // Die C Bibliothek muss importiert werden import "fmt" // Füge den folgenden kommentierten Code hinzu, der angibt, dass er nach dem Export von Python aufgerufen werden kann // Beachten Sie, dass der folgende Kommentar nicht als "// export xxx" geschrieben werden sollte, sondern als "//export xxx" // Andernfalls kann er nicht aufgerufen werden //export PrintDll func PrintDll() { fmt.Println("Ich komme aus der GO Dynamic Link Library") } //export Add func Add(a int, b int) int { return a + b } func main() { // Eine Main Funktion muss als Einstiegspunkt für die CGO Kompilierung hinzugefügt werden, ohne spezifischen Implementierungscode }
In diesem Code haben wir zwei Funktionen definiert, PrintDll
und Add
, und diese Funktionen durch den speziellen Kommentar //export
als von Python aufrufbar markiert. Gleichzeitig ist die main
-Funktion zwar ohne spezifischen Implementierungscode vorhanden, aber als Einstiegspunkt für die CGO-Kompilierung notwendig.
Kompilieren in eine Dynamic-Link-Library-Datei
Da verschiedene Betriebssysteme unterschiedliche Umgebungen haben, variieren auch die Methoden zum Kompilieren der Quelldatei add.go
. Im Folgenden stellen wir sie nach Plattform vor:
Linux und Mac
Im Allgemeinen wird das Linux-System mit der vorinstallierten Software gcc
geliefert, und wir können direkt den folgenden Befehl zur Kompilierung verwenden:
go build -buildmode=c-shared -o add.so add.go
Der obige Befehl kompiliert add.go
in die Dynamic-Link-Library-Datei add.so
.
Windows
Zum Kompilieren unter Windows müssen Sie zuerst die MinGW-Software installieren. Nach Abschluss der Installation können Sie `gcc verwenden. Der Kompilierungsbefehl lautet wie folgt:
go build -buildmode=c-shared -o add.dll add.go
Dieser Befehl kompiliert add.go
in die Dynamic-Link-Library-Datei add.dll
.
Optimieren des Kompilierungsergebnisses
Unter normalen Umständen ist die durch die obige Kompilierungsmethode erhaltene Dynamic-Link-Library-Datei relativ groß, was auch ein Problem ist, das die Go-Sprache oft kritisiert wird. Wir können jedoch den folgenden Ansatz verwenden, um die Größe der kompilierten Datei bis zu einem gewissen Grad zu reduzieren:
go build -ldflags "-s -w" -buildmode=c-shared -o add.so add.go
Unter diesen Befehlen bedeutet -s
Komprimierung; -w
bedeutet das Entfernen von Debugging Informationen. Auf diese Weise kann die Größe der Dynamic-Link-Library-Datei effektiv reduziert werden.
Aufrufen der Dynamic-Link-Library-Datei in Python
Um die kompilierte Dynamic-Link-Library-Datei in Python aufzurufen, müssen wir das ctypes
-Modul verwenden. Die spezifische Aufrufmethode ist wie folgt:
# Testen des in der GO Sprache geschriebenen Aufrufcodes von Python aus # Zuerst muss der GO Code in eine Dynamic-Link-Library kompiliert werden from ctypes import cdll lib = cdll.LoadLibrary("./add.so") # Geben Sie hier die kompilierte Dynamic-Link-Library-Datei an # Aufrufen der Add Funktion in der GO Sprache result = lib.Add(100, 200) print("result ", result) # Aufrufen der PrintDll Funktion in der GO Sprache lib.PrintDll()
Der obige Python-Code kann direkt im Jupyter Notebook ausgeführt werden. Sie können ihn auch als die Datei add.py
speichern und ihn dann in der Kommandozeile ausführen:
time python add.py
Das Ergebnis der Ausführung ist wie folgt:
result 300
Ich komme aus der GO Dynamic Link Library
python add.py 0.02s user 0.01s system 20% cpu 0.030 total
Durch die obigen Schritte haben wir erfolgreich erreicht, die in der Go-Sprache geschriebene Dynamic-Link-Library in Python aufzurufen, wobei wir die Vorteile beider Sprachen voll ausschöpfen und die Entwicklungseffizienz und die Berechnungsgeschwindigkeit steigern.
Leapcell: Das Beste von Serverless Web Hosting
Abschließend möchte ich eine Plattform empfehlen, welche am besten geeignet ist, um Go/Python Dienste zu bereitstellen: Leapcell
🚀 Entwickeln Sie mit Ihrer Lieblingssprache
Entwickeln Sie mühelos in JavaScript, Python, Go oder Rust.
🌍 Stellen Sie unbegrenzt Projekte kostenlos bereit
Zahlen Sie nur für das, was Sie nutzen – keine Anfragen, keine Gebühren.
⚡ Pay-as-You-Go, keine versteckten Kosten
Keine Leerlaufgebühren, sondern nahtlose Skalierbarkeit.
📖 Entdecken Sie unsere Dokumentation
🔹 Folgen Sie uns auf Twitter: @LeapcellHQ