python笔记:python调用C库

前言

在python中实现算法性能较差,所以在某些瓶颈处,可以把算法用C语言的实现。编译成动态链接库,再让python调用。

示例

下面示例一个算法,冒泡排序。

用C语言实现冒泡排序算法

代码如下(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;
            }
        }
    }
}

编译C库

可以使用如下的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调用

在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()接口就行。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android研究院

搞定数据结构-栈和队列

如下,使用栈结构操作. “网”这个错别字在栈顶,“网”改成”望”只需要将“网”从栈顶移除重新写入”望”.

4720
来自专栏PHP专享栏

Windows下ThinkPHP与Linux互通之exec或shell_exec问题

最近在做一个项目需要用到PHP调用Linux命令行脚本,在服务器执行命令是可以的,但是当放在项目代码中,在web中执行命令就不行了,调试了一天,终于可以了!

10010
来自专栏GitHubDaily

Python 之父宣布退休,但 Python 仍在吞噬世界

10 月 30 日,Python 之父 Guido 大牛宣布退休,离开 Dropbox。

9710
来自专栏Python空间

Python 标准库之时间篇

在昨天的文章(Python 标准库之日期)中我们学习了 Python 标准库中「日期 & 时间」中的「日期」,本来想昨天一起写完的,鉴于内容太多怕学起来厌烦了,...

4610
来自专栏刷题笔记

c++11/14快速入门(一)实验楼学习笔记

从现在开始,你的脑子里应该树立 『C++ 不是 C 的一个超集』这个观念(而且从一开始就不是)。在编写 C++ 时,也应该尽可能的避免使用诸如 void* 之类...

3210
来自专栏攻城狮的动态

深入理解Block

我用了将近一周的时间将与Block相关的知识点进行了整理,将相关内容整理成了脑图,分享给大家:

7310
来自专栏cppentry

C++ 获取当前系统时间

time() 是系统C语言的标准接口,通过man time 或者man 2 time 可查看详细的使用方法。

11420
来自专栏DBA随笔

Linux命令之nohup

语法:nohup Command [ Arg ... ] [ & ] 描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽...

6110
来自专栏奔跑的键盘侠

C语言——小学四年级题目解析(二)

乍一看,就是一道小学数学题,一个经典的解题思路:吹个口哨,所有的小动物抬起2只脚,总共会抬起92*2=184只脚,剩下358-184=174只脚,鸡两只脚都抬起...

9220
来自专栏编程创造城市

零基础Python教程035期 exec和eval字符串转python执行妙用

>>> exec("print('姓名:'+name+'性别:'+sex)",person)

5310

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励