PythonからGoを呼び出す: GoでPythonを高速化する
Grace Collins
Solutions Engineer · Leapcell

PythonからGoを呼び出す: GoでPythonを高速化する
今日のソフトウェア開発の状況では、PythonとGoはどちらも非常に人気のあるプログラミング言語であり、それぞれが独自の利点を持っています。Pythonは、その簡潔でエレガントな構文と豊富なライブラリで知られており、開発効率を大幅に向上させます。データサイエンス、人工知能、Webスクレイピングなどの分野で広く応用されています。一方、Go言語は静的に型付けされたコンパイル言語です。優れた並行処理性能と高い実行効率を誇り、高性能ネットワークサービス、分散システム、システムレベルのプログラミングシナリオの構築によく使用されます。
PythonとGoの組み合わせ:動的リンクライブラリを活用して開発と計算効率を向上させる
今日のソフトウェア開発の状況では、PythonとGoはどちらも非常に人気のあるプログラミング言語であり、それぞれが独自の利点を持っています。Pythonは、その簡潔でエレガントな構文と豊富なライブラリで知られており、開発効率を大幅に向上させます。データサイエンス、人工知能、Webスクレイピングなどの分野で広く応用されています。一方、Go言語は静的に型付けされたコンパイル言語です。優れた並行処理性能と高い実行効率を誇り、高性能ネットワークサービス、分散システム、システムレベルのプログラミングシナリオの構築によく使用されます。
いくつかの複雑なプロジェクトの開発に着手する場合、これらの2つの言語の長所を最大限に活用したいと考えることがよくあります。たとえば、複雑な計算部分をGoを使用して開発し、動的リンクライブラリにコンパイルしてから、Pythonで呼び出すことができます。このようにして、Pythonの開発の利便性を活用し、Goの効率的な計算能力を利用して、開発効率と計算速度を向上させるという目標を達成できます。
動的リンクライブラリの紹介
動的リンクライブラリ(略してDLL)ファイルは、実行不可能なバイナリプログラムファイルです。その主な機能は、実行中のプログラムが特定のタスクの実行に必要なコードとリソースを共有できるようにすることです。動的リンクライブラリには、オペレーティングシステムによって異なるファイル拡張子があります。Windowsオペレーティングシステムでは、動的リンクライブラリは通常、.dll
拡張子で終わります。一方、Linuxシステムでは、動的リンクライブラリは通常、.so
拡張子で終わります。
動的リンクの原則は、一般的に共有されるコードからDLLファイルを作成することです。実行可能ファイルがDLLファイル内の関数を呼び出すと、WindowsオペレーティングシステムはDLLファイルをメモリにロードします。DLLファイル自体の構造は実行可能ファイルであり、関数はプログラムが必要とする場合にのみリンクされます。この動的リンク方式により、メモリの浪費の状況を大幅に削減できます。対照的に、静的リンクは必要なコードを実行可能ファイルに直接リンクします。DLLの本来の設計目的は、アプリケーションプログラムに必要なディスクおよびメモリスペースを節約することでした。
Goコードの例
ここでは、簡単なGoコードの例を紹介します。これをadd.go
ファイルとして保存します:
package main import "C" // Cライブラリをインポートする必要があります import "fmt" // 次のコメント付きコードを追加します。これは、エクスポート後、Pythonから呼び出すことができることを示しています // 次のコメントは"// export xxx"としてではなく、"//export xxx"として記述する必要があることに注意してください // そうでない場合、呼び出すことはできません //export PrintDll func PrintDll() { fmt.Println("I come from the GO dynamic link library") } //export Add func Add(a int, b int) int { return a + b } func main() { // CGOコンパイルのエントリポイントとしてmain関数を追加する必要があります。特定の実装コードはありません }
このコードでは、PrintDll
とAdd
の2つの関数を定義し、特別なコメント//export
を介して、これらの関数がPythonから呼び出し可能としてマークしました。同時に、main
関数には特定の実装コードはありませんが、CGOコンパイルのエントリポイントとして必要です。
動的リンクライブラリファイルへのコンパイル
オペレーティングシステムが異なると環境も異なるため、add.go
ソースファイルをコンパイルする方法も異なります。以下では、プラットフォームごとに紹介します:
LinuxとMac
通常、Linuxシステムにはgcc
ソフトウェアがプリインストールされており、次のコマンドをコンパイルに直接使用できます:
go build -buildmode=c-shared -o add.so add.go
上記のコマンドは、add.go
をadd.so
動的リンクライブラリファイルにコンパイルします。
Windows
Windowsでコンパイルするには、まずMinGWソフトウェアをインストールする必要があります。インストールが完了したら、gcc
を使用できます。コンパイルコマンドは次のとおりです:
go build -buildmode=c-shared -o add.dll add.go
このコマンドは、add.go
をadd.dll
動的リンクライブラリファイルにコンパイルします。
コンパイル結果の最適化
通常、上記のコンパイル方法で取得した動的リンクライブラリファイルは比較的大きくなります。これは、Go言語がよく批判される問題でもあります。ただし、次のアプローチを使用して、コンパイルされたファイルのサイズをある程度縮小できます:
go build -ldflags "-s -w" -buildmode=c-shared -o add.so add.go
その中で、-s
は圧縮を示します。-w
はデバッグ情報の削除を示します。このようにして、動的リンクライブラリファイルのサイズを効果的に縮小できます。
Pythonでの動的リンクライブラリファイルの呼び出し
コンパイルされた動的リンクライブラリファイルをPythonで呼び出すには、ctypes
モジュールを使用する必要があります。具体的な呼び出し方法は次のとおりです:
# PythonからGO言語で記述された呼び出しコードをテストする # まず、GOコードを動的リンクライブラリにコンパイルする必要があります from ctypes import cdll lib = cdll.LoadLibrary("./add.so") # ここにコンパイルされた動的リンクライブラリファイルを指定します # GO言語のAdd関数を呼び出す result = lib.Add(100, 200) print("result ", result) # GO言語のPrintDll関数を呼び出す lib.PrintDll()
上記のPythonコードは、Jupyterノートブックで直接実行できます。add.py
ファイルとして保存し、コマンドラインで実行することもできます:
time python add.py
実行結果は次のとおりです:
result 300
I come from the GO dynamic link library
python add.py 0.02s user 0.01s system 20% cpu 0.030 total
上記の手順により、PythonでGo言語で記述された動的リンクライブラリの呼び出しが正常に実現し、両方の言語の利点を最大限に活用し、開発効率と計算速度を向上させました。
Leapcell:最高のサーバーレスWebホスティング
最後に、Go / Pythonサービスの展開に最適なプラットフォームをお勧めします:Leapcell
🚀 お気に入りの言語で構築する
JavaScript、Python、Go、またはRustで簡単に開発できます。
🌍 無料で無制限のプロジェクトを展開する
使用した分だけ支払い—リクエストも料金もありません。
⚡ 従量課金制、隠れたコストなし
アイドル料金はなく、シームレスなスケーラビリティのみ。
🔹 Twitterでフォローしてください:@LeapcellHQ