Python에서 Go 호출: Go로 Python 속도 향상
Grace Collins
Solutions Engineer · Leapcell

Python과 Go 결합: 동적 연결 라이브러리를 활용하여 개발 및 계산 효율성 향상
오늘날의 소프트웨어 개발 환경에서 Python과 Go는 각각 고유한 장점을 가진 매우 인기 있는 프로그래밍 언어입니다. Python은 간결하고 우아한 구문과 풍부한 라이브러리로 유명하여 개발 효율성을 크게 향상시킵니다. 데이터 과학, 인공 지능, 웹 스크래핑과 같은 분야에서 널리 사용됩니다. 반면에 Go 언어는 정적으로 타입이 지정되고 컴파일된 언어입니다. 뛰어난 동시성 성능과 높은 실행 효율성을 자랑하며 고성능 네트워크 서비스, 분산 시스템 및 시스템 수준 프로그래밍 시나리오를 구축하는 데 자주 사용됩니다.
일부 복잡한 프로젝트를 개발할 때 이러한 두 언어의 강점을 최대한 활용하기를 바랍니다. 예를 들어, 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("저는 GO 동적 연결 라이브러리에서 왔습니다.") } //export Add func Add(a int, b int) int { return a + b } func main() { // CGO 컴파일의 진입점인 main 함수를 추가해야 하며 특정 구현 코드는 없습니다. }
이 코드에서는 두 개의 함수 PrintDll
과 Add
를 정의하고 특수 주석 //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
저는 GO 동적 연결 라이브러리에서 왔습니다.
python add.py 0.02s user 0.01s system 20% cpu 0.030 total
위의 단계를 통해 Python에서 Go 언어로 작성된 동적 연결 라이브러리를 성공적으로 호출하여 두 언어의 장점을 최대한 활용하고 개발 효율성과 계산 속도를 향상시켰습니다.
Leapcell: 최고의 서버리스 웹 호스팅
마지막으로 Go/Python 서비스를 배포하는 데 가장 적합한 플랫폼인 **Leapcell**을 추천합니다.
🚀 선호하는 언어로 빌드
JavaScript, Python, Go 또는 Rust로 쉽게 개발하세요.
🌍 무제한 프로젝트를 무료로 배포
사용한 만큼만 지불하세요. 요청도 없고 요금도 없습니다.
⚡ 사용량에 따라 지불, 숨겨진 비용 없음
유휴 요금이 없고 원활한 확장성만 제공됩니다.
🔹 트위터에서 팔로우하세요: @LeapcellHQ