让python和C/C++联姻【转】
python不在孤单,轻易而举的为python写C/C++第三方库。
我们都知道python很慢,特别是处理大数据的时候,简直慢到极致,如果在知道代码的瓶颈的时候,可以将需要大量计算的数据块放在C/C++代码里运算,然后再将数据返回给python。对,这也让python易于扩展,这样我们可以将大部分时间放在核心的代码上。
在看过一些复杂的调用方式之后,总觉得上手不易,麻烦,细想,这完全与python的simple is better哲理违背啊,果断放弃。这几天在深圳先进研究院做项目的时候,用到了QT,然后无意中发现了SIP。官方解释是SIP is a tool for automatically generating Python bindings for C and C++ libraries(还是用原文比较好,翻译之后总觉得变味了)。起初,SIP是为了PyQt而建,不过也能为其他C/C++库生成python的代码。
就此,发现了让python调用C/C++代码的利器。这样我们就可以游刃有余的穿梭在python和C/C++代码之间了。It’s perfect。有时细想,python开发的高速度加上C/C++运行的高速度,能让JAVA汗颜了吧。不过,企业承认JAVA的稳定性还是NO.1的,我也不敢乱加评价。
那好,我们开始SIP之旅吧。
下面我是在windows下的配置,不过我没有用windows下默认的编译器,因为我发现中途遇见了各种问题,彻底让我心碎了,所以我用了mingw32.
第一步:配置环境
第二步:安装SIP
切换到SIP的根目录下,运行
python configure.py --platform win32-g++
指定SIP在C/C++代码时,是使用mingw32版本的编译器。
然后执行
make make install
大功告成。
第三步:让C/C++跑起来吧
创建3个文件。
configure.py mymath.cpp mymath.h mymath.sip
内容分别是:
configure.py
- import os
- import sipconfig
- # The name of the SIP build file generated by SIP and used by the build
- # system.
- build_file = "mymath.sbf"
- # Get the SIP configuration information.
- config = sipconfig.Configuration()
- # Run SIP to generate the code.
- cmd = " ".join([config.sip_bin, "-c", ".", "-b", build_file, "mymath.sip"])
- os.system(cmd)
- # Create the Makefile.
- makefile = sipconfig.SIPModuleMakefile(config, build_file)
- # Add the library we are wrapping. The name doesn't include any platform
- # specific prefixes or extensions (e.g. the "lib" prefix on UNIX, or the
- # ".dll" extension on Windows).
- makefile.extra_libs = ["mymath"]
- makefile.LIBDIR.append("./")
- # Generate the Makefile itself.
- makefile.generate()
mymath.h
- /*
- define my own math library
- */
- class MyMath{
- public:
- int Add(int a, int b);
- int Minus(int a, int b);
- };
mymath.cpp
- #include "mymath.h"
- int MyMath::Add(int a, int b)
- {
- return a + b;
- }
- int MyMath::Minus(int a, int b)
- {
- return a - b;
- }
mymath.sip
- // Define the SIP wrapper to the word library.
- %Module MyMath
- class MyMath {
- %TypeHeaderCode
- #include "mymath.h"
- %End
- public:
- int Add(int a, int b);
- int Minus(int a, int b);
- };
执行文件下的configure.py,你可以看到生成以下文件:
mymath.sbf sipAPIMyMath.h sipMyMathcmodule.cpp sipMyMathMyMath.cpp Makefile
可以看看makefile文件的内容。
在这里需要生成mymath的静态链接库,用以下命令:
g++ -c mymath.cpp ----->生成objective file,mymath.o
ar cr mymath.lib mymath.o ----->生成静态链接库mymath.lib
到此,离成功还有半步距离了。
然后再执行make,即生成MyMath.pyd,如果你想安装MyMath.pyd,则make install即可。
我们来看看我们扩展的C/C++库吧。
>>> import MyMath
>>> dir(MyMath)
['MyMath', '__doc__', '__file__', '__name__', '__package__']
>>> s = MyMath.MyMath()
>>> dir(s)
['Add', 'Minus', '__class__', '__delattr__', '__dict__', '__doc__', '__format__'
, '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce
__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__sub
classhook__', '__weakref__']
>>> s.Add(1, 2)
3
好,白杨到此一游。Enjoy it。具体内容请详看相应的参考文件。
-----------------打造高质量的文章 更多关注 把酒泯恩仇---------------
为了打造高质量的文章,请 推荐 一个吧。。。。谢谢了,我会写更多的好文章的。
请关注sina微博:http://weibo.com/baiyang26
把酒泯恩仇官方博客:http://www.ibaiyang.org 【推荐用google reader订阅】
把酒泯恩仇官方豆瓣:http://www.douban.com/people/baiyang26/
让python和C/C++联姻【转】的更多相关文章
- python中while与else的联姻
循环使用 else 语句在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断 ...
- Python实现电子词典(web)
思路: 准备配置文件setting.py,运行src/data.py,使用MySQL新建数据库并创建table,将字典数据导入到table中.编写server.py文件,建立服务端,循环接收web请求 ...
- Python实现电子词典(图形界面)
Python实现电子词典(图形界面) 终端电子词典:https://www.cnblogs.com/noonjuan/p/11341375.html 文件一览: .├── client.py├── d ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议
软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
随机推荐
- GPT分区表的备份与恢复
GPT分区表的备份与恢复 keenshoes 2016-01-13 21:02:25 关键词: GPT, Partition, MBR,APPLE, GUID, Protective MBR 对于现 ...
- Linux网络编程之"获取网络天气信息"
需求分析: 1.需要Linux c 网络编程基础, 2.需要了解 http 协议 3.需要天气信息相关api(可以从阿里云上购买,很便宜的!) 4.需要cJSON解析库(因为获取到的天气信息一般是用c ...
- HDU-3366-Count the string(KMP,DP)
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 大数据的存储——HBase、HIVE、MYSQL数据库学习笔记
HBase 1.hbase为查询而生,它通过组织机器的内存,提供一个超大的内存hash表,它需要组织自己的数据结构,表在hbase中是物理表,而不是逻辑表,搜索引擎用它来存储索引,以满足实时查询的需求 ...
- js跨域及解决办法
1.什么是跨域 我们经常会在页面上使用ajax请求访问其他服务器的数据,此时,客户端会出现跨域问题. 跨域问题是由于javascript语言安全限制中的同源策略造成的. 简单来说,同源策略是指一段脚本 ...
- IOS开发学习笔记009-OC基本知识
开始学习OC,时间不等人啊,要抓紧了. OC基本知识 新建一个以.m结尾的文件,这既是oc的程序文件.在oc程序中完全兼容C语言.编译好链接类似. oc包含头文件是使用#import <> ...
- camelot工具进行pdf表格解析重建
camelot内置生成html文件的方法,但表格数据转化成pandas.dataframe的过程中,丢失了跨行跨列的结构信息,故生成html的表格无跨行跨列结构. 于是我在输出部分选择直接手写html ...
- sqlserver不能创建数据库关系图
use [你的数据库名]EXEC sp_changedbowner 'sa'
- nodejs、yarn编译安装
yarn和npm一样,是nodejs的一个依赖管理工具 1.安装nodejs 如果缺少c++ compiler 会报错 yum install -y gcc gcc-c++ 安装nodejs V8 ...
- 【bzoj4836】[Lydsy2017年4月月赛]二元运算 分治+FFT
题目描述 定义二元运算 opt 满足 现在给定一个长为 n 的数列 a 和一个长为 m 的数列 b ,接下来有 q 次询问.每次询问给定一个数字 c 你需要求出有多少对 (i, j) 使得 a_ ...