python常用api_常用的Python接口,C语言也挡不住Python的强大
Pyton和C分别有着各自的优缺点,用Python开发程序速度快,可靠性高,并且有许多高级模块可供使用,但执行速度相对较慢;C语言则正好相反,执行速度快,但开发效率低。为了利用两种语言各自的优点,比较好的做法是用Python开发整个软件框架,而用C语言实现高效功能模块。
一、简介
Python是一门功能强大的高级脚本语言,它的强大不仅表现在其自身的功能上,而且还表现在其良好的可扩展性上,正因如此,Python已经开始受到越来越多人的青睐,并且被屡屡成功地应用于各类大型软件系统的开发过程中。
与其它普通脚本语言有所不同,Python程序员可以借助Python语言提供的API,使用C或者C 来对Python进行功能性扩展,从而即可以利用Python方便灵活的语法和功能,又可以获得与C或者C 几乎相同的执行性能。执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人们指责的一个重要因素,Python则通过与C语言的有机结合巧妙地解决了这一问题,从而使脚本语言的应用范围得到了很大扩展。
在用Python开发实际软件系统时,很多时候都需要使用C/C 来对Python进行扩展。最常见的情况是目前已经存在一个用C编写的库,需要在Python语言中使用该库的某些功能,此时就可以借助Python提供的扩展功能来实现。此外,由于Python从本质上讲还是一种脚本语言,某些功能用Python实现可能很难满足实际软件系统对执行效率的要求,此时也可以借助Python提供的扩展功能,将这些关键代码段用C或者C 实现,从而提供程序的执行性能。
二、Python的C语言接口
Python是用C语言实现的一种脚本语言,本身具有优良的开放性和可扩展性,并提供了方便灵活的应用程序接口(API),从而使得C/C 程序员能够在各个级别上对Python解释器的功能进行扩展。在使用C/C 对Python进行功能扩展之前,必须首先掌握Python解释所提供的C语言接口。
2.1 Python对象(PyObject)
Python是一门面向对象的脚本语言,所有的对象在Python解释器中都被表示成PyObject,PyObject结构包含Python对象的所有成员指针,并且对Python对象的类型信息和引用计数进行维护。在进行Python的扩展编程时,一旦要在C或者C 中对Python对象进行处理,就意味着要维护一个PyObject结构。
在Python的C语言扩展接口中,大部分函数都有一个或者多个参数为PyObject指针类型,并且返回值也大都为PyObject指针。
2.2 引用计数
为了简化内存管理,Python通过引用计数机制实现了自动的垃圾回收功能,Python中的每个对象都有一个引用计数,用来计数该对象在不同场所分别被引用了多少次。每当引用一次Python对象,相应的引用计数就增1,每当消毁一次Python对象,则相应的引用就减1,只有当引用计数为零时,才真正从内存中删除Python对象。
下面的例子说明了Python解释器如何利用引用计数来对Pyhon对象进行管理:
在C/C 中处理Python对象时,对引用计数进行正确的维护是一个关键问题,处理不好将很容易产生内存泄漏。Python的C语言接口提供了一些宏来对引用计数进行维护,最常见的是用Py_INCREF()来增加使Python对象的引用计数增1,用Py_DECREF()来使Python对象的引用计数减1。
2.3 数据类型
Python定义了六种数据类型:整型、浮点型、字符串、元组、列表和字典,在使用C语言对Python进行功能扩展时,首先要了解如何在C和Python的数据类型间进行转化。
2.3.1 整型、浮点型和字符串
在Python的C语言扩展中要用到整型、浮点型和字符串这三种数据类型时相对比较简单,只需要知道如何生成和维护它们就可以了。下面的例子给出了如何在C语言中使用Python的这三种数据类型:
2.3.2 元组
Python语言中的元组是一个长度固定的数组,当Python解释器调用C语言扩展中的方法时,所有非关键字(non-keyword)参数都以元组方式进行传递。下面的例子示范了如何在C语言中使用Python的元组类型:
2.3.3 列表
Python语言中的列表是一个长度可变的数组,列表比元组更为灵活,使用列表可以对其存储的Python对象进行随机访问。下面的例子示范了如何在C语言中使用Python的列表类型:
2.3.4 字典
Python语言中的字典是一个根据关键字进行访问的数据类型。下面的例子示范了如何在C语言中使用Python的字典类型:
2.4 程序交互接口
1.void Py_Initialize( )
初始化Python解释器,在C 程序中使用其它Python/C API之前,必须调用此函数,如果调用失败,将产生一个致命的错误。
2. int PyRun_SimpleString( const char *command)
执行一段Python代码,就好象是在__main__ 函数里面执行一样。例:
PyRun_SimpleString(
python常用api_常用的Python接口,C语言也挡不住Python的强大相关推荐
- 求助:新浪微博 Python API在使用statuses/show接口时请求参数id与python内置函数id之间的冲突
根据开发文档,statuses/show的介绍如下: 需求的请求参数是access_token和id 但是由于在Python IDE中,python作为内置函数名会和参数变量名冲突 可以看见id在Py ...
- 为什么 Python被Google选为TensorFlow的开发语言呢?使用 Python比C++语言进行机器学习有什么优势?
其实TensorFlow大部分内核并不是用Python编写的 :它是高度优化了C++和CUDA(Nvidia用于编程GPU的语言)的组合. 相反,通常它是使用了Eigen (高性能C ++和CUDA库 ...
- 如何将C++代码封装成C模块,适配Python、Lua和C++调用。多种语言(C++、python和lua)调用C++封装的看门狗sdk模块
概述 示例程序仓库路径:https://gitee.com/liudegui/test_dogservice 示例程序是对看门狗模块的封装,已在windows平台测试,代码理论上可直接支持Linux平 ...
- python培训机构哪家靠谱_好程序员告诉你Python机构哪家比较靠谱
原标题:好程序员告诉你Python机构哪家比较靠谱 诚如大家所知,Python语言的就业方向多样,大体上可以划分为:Linux运维.Python自动化测试.Python全栈工程师.数据分析.人工智能等 ...
- 数据科学 | Python数据科学常用库
Python 在解决数据科学任务和挑战方面继续处于领先地位. 目录 核心库 IPython NumPy SciPy Pandas StatsModels 可视化 Matplotlib Seaborn ...
- python第三方库有哪些常用的、请列举15个-你想要的Python面试都在这里了【315+道题】...
第一部分 Python基础篇(80题) 1.为什么学习Python? 1.python是脚本语言,作为程序员至少应该掌握一本通用脚本语言,因为脚本语言与编译语言的开发测试过程不同,可以极大的提高编程效 ...
- python第三方库排行-Python模块汇总(常用第三方库)
模块 定义 计算机在开发过程中,代码越写越多,也就越难以维护,所以为了编写可维护的代码,我们会把函数进行分组,放在不同的文件里.在python里,一个.py文件就是一个模块 优点: 提高代码的可维护性 ...
- python 魔法方法常用_Python魔法方法指南
有很多人说学习Python基础之后不知道干什么,不管你是从w3c还是从廖雪峰的教程学习的,这些教程都有一个特点:只能引你快速入门,但是有关于Python的很多基础内容这些教程中都没介绍,而这些你没学习 ...
- python图形化方式模块安装_(怎么安装python模块,如何安装python模块,常用安装方式)python助手安装教程视频...
有没有比较好的python3的入门视频教程,网盘或网站都可以. 我这里有Python,开发,进阶,自动化,实战列视频教程,还有安装包,,代码等容,这里就不一一说了,全套内容一共300G左右,非常的详细 ...
最新文章
- linux上使用FTP下载文件
- springbot集成finereport后在web中使用iframe引用报表
- 动态代理,动态代理设计模式 ,JDK动态代理,cglib动态代理
- Android插件化开发之运行未安装apk的activity
- 使用Spring Boot和Project Reactor处理SQS消息-第2部分
- 37职责链模式(Chain of Responsibility Pattern)
- asp.net中ADO.NET连接SQL数据库代码和连接Access数据库代码
- Mac Nginx 配置 Tomcat 配置 jdk环境变量 Nginx部署服务遇到的坑(3)
- vuejs知乎_你也许不知道的Vuejs - 深入浅出响应式系统
- 【汇编语言/底层开发】9、转移指令的原理
- php海思hi3531d,海思hi3531DV200 h.265编解码AI处理器
- 破解Access(*.mdb)目前所有版本的密码
- DirectX12(D3D12)基础教程(十)——DXR(DirectX Raytracing)基础教程(上)
- 程序员5大热门发展行业,就业迷茫的同学注意啦!
- 【Day2.4】在华欣葡萄酒庄园午餐,风景也值这个价钱
- 【Mysql】Mysql GTID复制进程出现异常,出现断点
- 针对Linux系统主机,进入修复模式,解决开机报错问题
- echarts 百度地图统计分布图,地图可视化统计
- 我参加NVIDIA Sky Hackathon(语音识别模型训练)
- python数据分析实战之信用卡违约风险预测
热门文章
- python学习笔记之类和对象
- Python编程基础之Python语言的输入输出
- 通过开户银行账号查询客商名称 sql
- 程序员与年龄:人到中年不得已!程序员到了三四十岁该怎么办?
- 解决Angular HttpClient设置headers后,Body体格式问题
- 一根飞线的故事-SVG篇
- 联璧金融崩盘!斐讯0元购抛弃合作伙伴求生,以后还能投资什么?
- JS控制下的双层Tab切换
- GitHub 上 4w+ Star 大佬的求职回忆
- maven报错:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“. SLF4J: Defaulting to no-ope