在python中实现算法性能较差,所以在某些瓶颈处,可以把算法用C语言的实现。编译成动态链接库,再让python调用。
下面示例一个算法,冒泡排序。
代码如下(clib.c):
void bubble_sort(int a[],int n)//n为数组a的元素个数
{
int i;
int temp;
for(i=0; i<n-1; i++)
{
int j;
for(j=0; j<n-1-i; j++)
{
if(a[j] > a[j+1])
{
temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
}
}
}
}
可以使用如下的bash脚本(build.sh):
rm c_lib.o c_lib.so
gcc -c -fPIC c_lib.c
gcc -shared c_lib.o -o c_lib.so
编译完成后,在当前目录可以发现c_lib.so
文件。
在python中,使用ctypes来打通C与python的类型界限。特别注意list在python和C之间的转换方式。
在本例中,参考代码如下:
import ctypes
import random
import time
lib_c = ctypes.cdll.LoadLibrary("./c_lib.so")
data = [random.randint(1,9000) for x in range(1000)]
start = time.time()
c_arr = (ctypes.c_int * len(data))(*data)
lib_c.bubble_sort(c_arr, len(data))
result = [x for x in c_arr]
print("cost time", time.time() - start)
运行时间比用纯python实现大大降低。 ps:这只是个例子,想用python排序,直接用sort()接口就行。