调用方法

如果觉得Python性能不够,可以使用C、C++或Rust、Golang为按标准C类型。为Python编写扩展。Python通过自带的ctypes模块,可以加载并调用C标准动态链接库(如.ddl 或 .so)中的函数。
常用的操作为:

import ctypes

# 加载动态链接库
lib = ctypes.CDLL("./xxx.so")

# 声明要调用函数的参数类型
lib.xxx.argtypes = [ctypes.xxx, ctypes.xxx, ...]

# 声明要调用函数的返回值类型
lib.xxx.restype = ctypes.xxx

例如,calc.so中有个c语言函数如下

int add_int(int a, int b) {
    return a + b;
}

则调用方法为

import ctypes

lib = ctypes.CDLL("./calc.so")
lib.add_int.argtypes=[ctypes.c_int, ctypes.c_int] # 都是c_int参数时可以省略
lib.add_int.restype = ctypes.c_int # 返回c_int时可以省略
print(lib.add_int(3, 5))

实践

  1. 使用C语言编写被调用函数
    calc.c
# include<stdio.h>

int add_int(int a, int b) {
    return a + b;
}

float add_float(float a, float b) {
    return a + b;
}

char * add_str(const char* a, const char* b, char *c) {
    sprintf(c, "%s%s", a, b);
    return c;
}
  1. 使用gcc编译为动态链接库

需要自行安装gcc

gcc -shared calc.c -o calc.so
  1. 使用Python调用C语言函数
    call_c.py
import ctypes


lib = ctypes.CDLL("./calc.so")
print(lib.add_int(3, 5))

lib.add_float.argtypes=[ctypes.c_float, ctypes.c_float]
lib.add_float.restype = ctypes.c_float
print(lib.add_float(3.2, 5.3))


lib.add_str.argtypes=[ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
lib.add_str.restype=ctypes.c_char_p
c = lib.add_str(b"Hello", b"World", b'')
print(c)

运行结果如下:

8
8.5
b'HelloWorld'