python调用c函数Python是解释性语言, 底层就是用c实现的, 所以用python调用C是很容易的, 下面就总结一下各种调用的方法, 给出例子, 所有例子都在ubuntu9.10, python2.6下试过
1. Python 调用 C (base)
想在python中调用c函数, 如这儿的fact
#include Python.h
int fact(int n)
{
if (n = 1)
return 1;
else
return n * fact(n - 1);
}
PyObject* wrap_fact(PyObject* self, PyObject* args)
{
int n, result;
if (! PyArg_ParseTuple(args, "i:fact", n))
return NULL;
result = fact(n);
return Py_BuildValue("i", result);
}
static PyMethodDef exampleMethods[] =
{
{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
{NULL, NULL}
};
void initexample()
{
PyObject* m;
m = Py_InitModule("example", exampleMethods);
}
把这段代码存为wrapper.c, 编成so库,
gcc -fPIC wrapper.c -o example.so -shared-I/usr/include/python2.6 -I/usr/lib/python2.6/config
然后在有此so库的目录, 进入python, 可以如下使用
import example
example.fact(4)
2. Python 调用 C(base)
在python中调用C类成员函数, 如下调用TestFact类中的fact函数,
#include Python.h
class TestFact{
public:
TestFact(){};
~TestFact(){};
int fact(int n);
};
int TestFact::fact(int n)
{
if (n = 1)
return 1;
else
return n * (n - 1);
}
int fact(int n)
{
TestFact t;
return t.fact(n);
}
PyObject* wrap_fact(PyObject* self, PyObject* args)
{
int n, result;
if (! PyArg_ParseTuple(args, "i:fact", n))
return NULL;
result = fact(n);
return Py_BuildValue("i", result);
}
static PyMethodDef exampleMethods[] =
{
{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},
{NULL, NULL}
};
extern "C"//不加会导致找不到initexample
void initexample()
{
PyObject* m;
m = Py_InitModule("example", exampleMethods);
}
把这段代码存为wrapper.cpp, 编成so库,
g-fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config
然后在有此so库的目录, 进入python, 可以如下使用
import example
example.fact(4)
3. Python 调用 C(Boost.Python)
Boost库是非常强大的库, 其中的python库可以用来封装c被python调用, 功能比较强大, 不但可以封装函数还能封装类, 类成员.
首先在ubuntu下安装boost.python, apt-get install libboost-python-dev
#include boost/python.hpp
char const* greet()
{
return "hello, world";
}
BOOST_PYTHON_MODULE(hello)
{
using namespace boost::python;
def("greet", greet);
}
把代码存为hello.cpp, 编译成so库
ghello.cpp -o hello.so -shared -I/usr/include/python2.5 -I/usr/lib/python2.5/config -lboost_python-gcc42-mt-1_34_1
此处python路径设为你的python路径, 并且必须加-lboost_python-gcc42-mt-1_34_1, 这个库名不一定是这个, 去/user/lib查
然后在有此so库的目录, 进入python, 可以如下使用
import hello
hello.greet()
'hello, world'
4. python 调用 c(ctypes)
ctypes is an advanced ffi (Foreign Function Interface) package for Python 2.3 and higher. In Python 2.5 it is already included.
ctypes allows to call functions in dlls/shared libraries and has extensive facilities to create, access and manipulate simple and complicated C data types in Python - in other words: wrap libraries in pure Python. It is even possible to implement C callback functions in pure Python.
#include Python.h
class TestFact{
public:
TestFact(){};
~TestFact(){};
int fact(int n);
};
int TestFact::fact(int n)
{
if (n = 1)
return 1;
else
return n * (n - 1);
}
extern "C"
int fact(int n)
{
TestFact t;
return t.fact(n);
}
将代码存为wrapper.cpp不用写python接口封装, 直接编译成so库,
g-fPIC wrapper.cpp -o example.so -shared -I/usr/include/python2.6 -I/usr/lib/python2.6/config
进入python, 可以如下使用
import ctypes
pdll = ctypes.CDLL('/home/ubuntu/tmp/example.so')
pdll.fact(4)
12
python能做什么python的用途:
Python的优势有必要作为第一步去了解 , Python作为面向对象的脚本语言,优势就是数据处理和挖掘,这也注定了它和AI、互联网技术的紧密联系 。
网络爬虫 。顾名思义,从互联网上爬取信息的脚本,主要由urllib、requests等库编写,实用性很强 , 小编就曾写过爬取5w数据量的爬虫 。在大数据风靡的时代 , 爬虫绝对是新秀 。
人工智能 。AI使Python一战成名,AI的实现可以通过tensorflow库 。神经网络的核心在于激活函数、损失函数和数据,数据可以通过爬虫获得 。训练时大量的数据运算又是Python的show time 。
扩展资料:
Python开发人员尽量避开不成熟或者不重要的优化 。一些针对非重要部位的加快运行速度的补丁通常不会被合并到Python内 。在某些对运行速度要求很高的情况,Python设计师倾向于使用JIT技术,或者用使用C/C语言改写这部分程序 。可用的JIT技术是PyPy 。
Python是完全面向对象的语言 。函数、模块、数字、字符串都是对象 。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性 。
Python支持重载运算符和动态类型 。相对于Lisp这种传统的函数式编程语言,Python对函数式设计只提供了有限的支持 。有两个标准库(functools, itertools)提供了Haskell和Standard ML中久经考验的函数式程序设计工具 。
参考资料来源:百度百科-Python
怎样把Python代码嵌入到C程序这篇文章主要介绍了将Python代码嵌入C程序进行编写的实例,尽管通常还是Python代码中调用C程序的情况较多...需要的朋友可以参考下
把python嵌入的C里面需要做一些步骤
安装python程序,这样才能使用python的头文件和库
在我们写的源文件中增加“Python.h”头文件 , 并且链入“python**.lib”库(还没搞清楚这个库时静态库还是导出库 , 需要搞清楚)
掌握和了解一些python的C语言api,以便在我们的c程序中使用
常用的一些C API函数
在了解下面的函数之前有必要了解一下**PyObject***指针,python里面几乎所有的对象都是使用这个指针来指示的 。
Py_Initialize()Py_Finalize()
在调用任何python的c函数之前需要调用的函数,“Py_Initialize”是用来初始化python模块的,推测是加载初始化加载dll的 。对应的在使用python模块之后用“Py_Finalize”来释放模块 。
PyImport_ImportModule()
用来载入一个python模块,这个模块就是一般的python文件 。这里需要注意的是,在加载这个模块的时候会执行模块里面所有可以执行的语句 。包括import导入语句和在函数体之外的所有语句
PyObject_GetAttrString()
返回模块里面的函数
Py_BuildValue()
建立一个参数元组,一般都是用这个函数来建立元组,然后将这个元组作为参数传递给python里面的函数 。
PyEval_CallObject()
调用函数,并把“Py_BuildValue”建立的元组作为参数传递给被调用的函数
源码实例
下面的实例是在c代码中调用Python的函数 , 传递参数并且获取返回值
test.cpp代码
[cpp] view plain copy
#include iostream
#include Python.h
using namespace std;
int main(int argc, char* argv[])
{
Py_Initialize();//初始化
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
PyObject* pParam = NULL;
PyObject* pResult = NULL;
const char* pBuffer = NULL;
int iBufferSize = 0;
pModule = PyImport_ImportModule(“test_python");
if (!pModule)
{
【python静态库c函数 python 静态】cout"get module failed!"endl;
exit (0);
}
pFunc = PyObject_GetAttrString(pModule, "main");
if (!pFunc)
{
cout"get func failed!"endl;
coutint(pFunc)endl;
exit (0);
}
pParam = Py_BuildValue("(s)", "HEHEHE");
pResult = PyEval_CallObject(pFunc,pParam);
if(pResult)
{
if(PyArg_Parse(pResult, "(si)", pBuffer, iBufferSize))
{
coutpBufferendl;
coutiBufferSizeendl;
}
}
Py_DECREF(pParam);
Py_DECREF(pFunc);
Py_Finalize();
//cout"hello"endl;
return 0;
}
test_python.py代码
[py] view plain copy
def main(szString):
return ("hello", 5)
为什么python内置的sort比自己写的快速排序快100倍?主要原因,内置函数用C写的 。在Python语言内无论如何造不出内置函数的轮子 。这也是通常C跟C语言用户更喜欢造基础算法的轮了的原因 。因为C/C用户真有条件写出匹敌标准库的算法,但很多高级语言不行,不是程序员技术差,是客观条件就根本做不到 。
你比如说Java语言没人造字符串的轮子,C光一个字符串类就有无数多的实现 。是因为C 用户更喜欢写字符串类吗?显然不是,一方面是因为Java语言内没法造出匹敌Java内置标准库算法的轮子,而C真的可以,另外一个比较惨的原因是C标准库的字符串功能太弱了,大多数高级语言的字符串类功能都比C 标准库字符串类功能更强 。
写C的时候一大错觉就是我觉着我能比标准库还快,同样的道理放在Python里面也同样适用 , 不管是Python各种常用package或内建函数 , 基本上都针对实用场景作了优化,自己手写的算法一般是比不上内建算法效率的,这也是为什么用Python时不鼓励自己造轮子的原因 。
回到这个问题 , Python内建的sort本质上为C实现的函数,本身执行效率就会比Python快很多 , 并且会根据不同的数据规模采用不同的排序算法,故效率一般都会优于自己在Python里面手写的排序更何况题主写的是基于递归的quicksort9,额外时间开销大 。
因为python内置的sort是用c语言写的,如果你用c语言或者c写的话肯定是可以做到一样快的至于为什么python计算效率比c语言能慢100倍这个具体的原理我不清楚,不过鉴于知乎上已经有很多大佬解释过这个问题 , 我就不在这里班门弄斧了
还有底下扯timsort的,快排序是所有比较排序算法里平均性能最优的一族算法,像C和rust里的unstable_sort都是用的快排序 。可能在一些情况下,比如数组几乎有序时,timsort会比快排序快 。但是你随便给一个数组,比如像题主那样随机一个一百万大小的数然后排序,timsort是绝对不可能比快排序快的 。绝对不可能 。快的这100倍和timsort屁关系都没有 。
我是C/C程序员,我可以很负责的告诉你,在用天下现有所有高级语言进行排序的问题上,C要是认了第二,则没人敢认第一 。所以,我猜,Python以及好多其他高级语言,都会时不时直接上C语言写的静态库和动态库 。我自己也造了不少轮子,有部分是因为刚刚起步,对系统API和函数库不熟悉,找不到适合的,所以自己造轮子 , 后来发现了有更好的,我把我写的抛弃了 。但这里也不排除有一部分是因为我个人觉得还有优化的空间,所以自己用C语言重新造了一个轮子,这样效率比现成的更优 。
所以说,要论高级语言的鼻祖,还真非C莫属,从执行效率上讲 , 别说python,JAVA,C#,VB,甚至C的亲儿子C,在同一个程序员手中,都没法与C抗衡,所以说,这些语言都是排着队等着被C吊打的,也正因为如此,所以 , 像python这类高级语言,有自带函数可用的,最好别想着自己重新造轮子,因为你不可能造出比自带函数更快的轮子 。
内置库函数都是用C实现的,肯定要比手写的Python程序执行效率更高 , 此外内置排序Timsort相比本科课程上学的时间复杂度为Onlogn的排序算法做了很多常数优化,所以对于普通人而言,不要希望纯手写出来的东西效率能和标准库相当了 。另外,题主写的排序是过不了LeetCode上的裸排序题目的 , 随机选取pivot对于快速排序是最基本的优化虽然题主排的是随机数,现在这么选肯定不是效率低的主要原因 。
所以说了 , py几乎得把自己的循环体拆了,这就是py和c/c的性能差距 , 必须尽量用内置函数和numpy来处理数据,一旦手写循环体 。,那你就得知道这可能得慢百倍,像用opency的py版时你不小心写个双循环来处理数据,那酸爽,而cppc#搞opencv就能随意用指针来写循环,这也是为啥他们其实不需要numpy这种组件,自身就有足够的性能和灵活度来处理这个 。
Cpp内置的排序是快排和堆排的结合,最坏时间复杂度为nlogn,而快排最坏是n2 。至于python内部的排序 , 我认为是一个道理,不会简简单单是一个快排,举个简单例子 , 当你数据已经是有序的时候,再传入快排肯定就不合适 。那你设置排序函数的时候,是不是预先将他打乱,再进行快排会更好呢 。当然具体不会这么简单 , 只是我认为官方给的接口都是很精妙的,很值得学习 。
一方面Python中sort函数是用C语言写的 , C内部的sort是由快排,直接插入和堆排序混合的,当数据量比较大的时候先用的快排,当数据量小的时候用直接插入 , 因为当数据量变小时,快排中的每个部分基本有序 , 接近直接插入的最好情况的时间复杂度O(n),就比快排要好一点了 。
另外一方面这个的底层实现就是归并排序 。,只是使用了Python无法编写的底层实现 , 从而避免了Python本身附加的大量开销,速度比我们自己写的归并排序要快很多,所以说我们一般排序都尽量使用sorted和sort 。
用python怎样调用静态库里的c函数将event.py目录加入到system path中
1
2
3
import sys
sys.path.append("/Users/songrao/Library/Application Support/Sublime Text 3/Packages/User/")
from event import printme
如何用python获得C函数中的变量的值?网页链接
python ctypes 第一句话:
ctypes is a foreign function library for Python. It provides C compatible data types, and allows calling functions in DLLs or shared libraries. It can be used to wrap these libraries in pure Python.
没看到有说可以直接访问data 。
你可以这样加这样的函数:
int get_a()
{
return a;
}
再在python里面调用 。
关于python静态库c函数和python 静态的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 网络电玩游戏厅,网络电玩游戏大厅攻略
- 35kvgis开关柜作用,35kv开关柜的作用
- 收售棋牌游戏币的简单介绍
- c语言计算行列式值得函数 行列式计算c语言程序设计
- html5如何连sqlite,如何用html连接数据库
- NoSQL与关系型数据库的区别,nosql和关系数据库的操作比较实验报告
- 免费课程直播平台,免费直播课堂教育平台有哪些
- mysql怎么多个赋值 mysql怎么一次添加多个数据
- 查询oracle表列数,oracle查询表的列数