swig 封装.c

http://blog.csdn.net/king_on/article/details/8092399

http://blog.csdn.net/lcz_ptr/article/details/7824414

百度搜 python swig ubuntu

整理

1. 编写c文件

Bit.h
#ifndef BIT_H
#define BIT_H

//create: 2012-10-19  
//version: 1.0  
#define CHAR_LENGTH sizeof(unsigned char)   
  
//Bit模拟位操作  
typedef struct  
{  
    unsigned char *pArray;//指向一个字符型数组,用以存储bit位  
    unsigned long length;//记录pArray的长度, 字符个数  
    unsigned long used;//记录用户使用的bit位  
}Bit;  
  
//创建Bit对象  
//@len: 初始化bit位数  
//@return: 返回一个指向Bit对象的指针, 该指针需要使用freeBit销毁  
Bit* createBit(unsigned long len);  
  
//设置bit位  
//@pb:指向Bit的一个对象, 如果为NULL, 返回1  
//@index: 需要设置的bit位, 范围应当是 (0~used)  
//@value: bit位的值, (0,1)  
//@return: 成功返回0, 如果出现pb==NULL, index out of range, value!=0 and value!=1, 返回1  
int setBit(Bit *pb,unsigned long index, int value);  
  
//获取bit位  
//@pb:指向Bit的一个对象, 如果为NULL, 返回1  
//@index: 需要设置的bit位, 范围应当是 (0~used)  
//@return: 成功返回0, 如果出现pb==NULL, index out of range, 返回1  
int getBit(Bit *pb,unsigned long index);  
  
//返回使用的长度  
//@pb: 如果pb==NULL, return -1  
int bitLength(Bit *pb);  
  
//销毁Bit对象  
void freeBit(Bit *pb);  
#endif  

Bit.c
#include "Bit.h"
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

//创建Bit对象  
//@len: 初始化bit位数, len>=0  
//@return: 返回一个指向Bit对象的指针, 该指针需要使用freeBit销毁  
Bit* createBit(unsigned long len)  
{  
    if(len<0)  
        return NULL;  
  
    Bit *pb=(Bit*)malloc(sizeof(Bit));  
    if(len>0)  
    {  
        pb->length=(len-1)/CHAR_LENGTH+1;  
        pb->pArray=(char*)malloc(sizeof(char)*pb->length);  
        pb->used=len;  
    }else  
    {  
        pb->length=0;  
        pb->pArray=NULL;  
        pb->used=len;  
    }  
    return pb;  
}  
  
//设置bit位  
//@pb:指向Bit的一个对象, 如果为NULL, 返回1  
//@index: 需要设置的bit位, 范围应当是 [0~used)  
//@value: bit位的值, (0,1)  
//@return: 成功返回0, 如果出现pb==NULL, index out of range, value!=0 and value!=1, 返回1  
int setBit(Bit *pb,unsigned long index, int value)  
{  
    if(pb==NULL || pb->pArray==NULL || index<0 || index>=pb->used || (value!=0 && value!=1))  
        return 1;  
  
    unsigned long a=index/CHAR_LENGTH;  
    unsigned long b=index%CHAR_LENGTH;  
    if(value==0)  
    {  
        pb->pArray[a]&=(UCHAR_MAX^(1<<b));  
        //printf("%d\n",pb->pArray[a]);  
    }else  
    {  
        pb->pArray[a]|=(1<<b);  
        //printf("%d\n",pb->pArray[a]);  
    }  
    return 0;  
}  
  
//获取bit位  
//@pb:指向Bit的一个对象, 如果为NULL, 返回1  
//@index: 需要设置的bit位, 范围应当是 [0~used)  
//@return: 成功返回0, 如果出现pb==NULL, index out of range, 返回1  
int getBit(Bit *pb,unsigned long index)  
{  
    if(pb==NULL || pb->pArray==NULL || index<0 || index>=pb->used)  
        return 1;  
    unsigned long a=index/CHAR_LENGTH;  
    unsigned long b=index%CHAR_LENGTH;  
    //printf("%d\n",pb->pArray[a]&(1<<b));  
    if((pb->pArray[a]&(1<<b))==0)  
        return 0;  
    else  
        return 1;  
}  
  
//返回使用的长度  
//@pb: 如果pb==NULL, return -1  
int bitLength(Bit *pb)  
{  
    if(pb==NULL || pb->pArray==NULL)  
        return -1;  
    return pb->used;  
}  
  
//销毁Bit对象  
void freeBit(Bit *pb)  
{  
    if(pb==NULL)  
        return;  
    if(pb->pArray!=NULL)  
    {  
        free(pb->pArray);  
        pb->pArray=NULL;  
    }  
    free(pb);  
}  

2. 编写SWIG使用的swg文件

Bit.i

%module Bit #module name  
%{  
#include "Bit.h" #加入Bit_wrap.c文件  
%}  
  
#需要导出到python的函数  
extern Bit* createBit(unsigned long len);  
extern int setBit(Bit *pb,unsigned long index, int value);  
extern int getBit(Bit *pb,unsigned long index);  
extern int bitLength(Bit *pb);  
extern void freeBit(Bit *pb);  

3. 编译

3.1 使用Bit.i生成wrap文件,该命令得到Bit_wrap.c Bit.py
[username]$ swig -python Bit.i  
3.2 编译Bit.c Bit_wrap.c文件,其中PYTHON_INCLUDE为python安装目录下的include文件夹, 如/usr/program/python/include/python.2.7username]$ gcc -c
[username]$ gcc -c -fpic Bit.c Bit_wrap.c -I${PYTHON_INCLUDE}  
3.3 连接得到动态库
[username]$ gcc -shared Bit.o Bit_wrap.o -o _Bit.so  

注意输出库文件为_Bit.so, 有下划线和模块名称组成

4.使用,这里以计算一亿一下的素数个数来演示

将Bit.py和_Bit.so文件复制到需要的位置

编写prime_count.py

#coding=utf-8  
#create-2012-10-17  
#version: 1.0  
#计算小于1亿的素数个数  
  
import time  
from Bit  import *  
  
MAX=100000000  
count=1  
  
#0 表示素数  
#1 表示已经去除  
  
start_time=time.time()  
  
len=MAX/2-1  
b=createBit(len)  
  
def remove(idx):  
    i=idx  
    global b  
    while i<len:  
        #b[i]=1  
        setBit(b,i,1)  
        i+=2*idx+3  
  
for i in range(3,MAX,2):  
    if getBit(b,(i-3)/2)==0:  
        #素数  
        count+=1  
        remove((i-3)/2)  
  
end_time=time.time()  
print count  
print end_time-start_time  

使用方法和其他python提供的模块一样

5.附计算结果

使用以上方法(c扩展python)得到结果为:

5761455(素数个数)  
113.465720892(second)  

另外,如果直接使用python模拟bit,并同样计算一亿一下的素数个数,结果为

5761455(素数个数)  
293.473055124(second)  

可以看到,性能提升非常明显(接近3倍),当然这只是一个例子,并不具有太多代表性

另附,同样的方法,如果是c语言,调用我们实现的Bit的话结果为:

5761455(素数个数)  
5(second)  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容