用C语言扩展Python的功能

用C语言扩展Python的功能
用C语言扩展Python的功能

用C语言扩展Python的功能(PDF资料整理https://www.360docs.net/doc/d3807465.html, 泛C++小组)

肖文鹏 (xiaowp@https://www.360docs.net/doc/d3807465.html,)

北京理工大学计算机系硕士研究生

2003 年 2 月

Pyton和C分别有着各自的优缺点,用Python开发程序速度快,可靠性高,并且有

许多现成模块可供使用,但执行速度相对较慢;C语言则正好相反,其执行速度

快,但开发效率低。为了充分利用两种语言各自的优点,比较好的做法是用

Python开发整个软件框架,而用C语言实现其关键模块。本文介绍如何利用C语言

来扩展Python的功能,并辅以具体的实例讲述如何编写Python的扩展模块。

一、简介

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语言扩展接口,以及如何使用这些接口和C/C++语言来对Python 进行功能性扩展,并辅以具体的实例讲述如何实现Python的功能扩展。

二、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对象进行管理:

例1:refcount.py

class refcount:

# etc.

r1 = refcount() # 引用计数为1

r2 = r1 # 引用计数为2

del(r1) # 引用计数为1

del(r2) # 引用计数为0,删除对象

在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:typeifs.c

// build an integer

PyObject* pInt = Py_BuildValue("i", 2003);

assert(PyInt_Check(pInt));

int i = PyInt_AsLong(pInt);

Py_DECREF(pInt);

// build a float

PyObject* pFloat = Py_BuildValue("f", 3.14f);

assert(PyFloat_Check(pFloat));

float f = PyFloat_AsDouble(pFloat);

Py_DECREF(pFloat);

// build a string

PyObject* pString = Py_BuildValue("s", "Python");

assert(PyString_Check(pString);

int nLen = PyString_Size(pString);

char* s = PyString_AsString(pString);

Py_DECREF(pString);

2.3.2 元组

Python语言中的元组是一个长度固定的数组,当Python解释器调用C语言扩展中的方法时,所有非关键字(non-keyword)参数都以元组方式进行传递。下面的例子示范了如何在C语言中使用Python的元组类型:

例3:typetuple.c

// create the tuple

PyObject* pTuple = PyTuple_New(3);

assert(PyTuple_Check(pTuple));

assert(PyTuple_Size(pTuple) == 3);

// set the item

PyTuple_SetItem(pTuple, 0, Py_BuildValue("i", 2003));

PyTuple_SetItem(pTuple, 1, Py_BuildValue("f", 3.14f));

PyTuple_SetItem(pTuple, 2, Py_BuildValue("s", "Python"));

// parse tuple items

int i;

float f;

char *s;

if (!PyArg_ParseTuple(pTuple, "ifs", &i, &f, &s))

PyErr_SetString(PyExc_TypeError, "invalid parameter");

// cleanup

Py_DECREF(pTuple);

2.3.3 列表

Python语言中的列表是一个长度可变的数组,列表比元组更为灵活,使用列表可以对其存储的Python对象进行随机访问。下面的例子示范了如何在C语言中使用Python的列表类型:

例4:typelist.c

// create the list

PyObject* pList = PyList_New(3); // new reference

assert(PyList_Check(pList));

// set some initial values

for(int i = 0; i < 3; ++i)

PyList_SetItem(pList, i, Py_BuildValue("i", i));

// insert an item

PyList_Insert(pList, 2, Py_BuildValue("s", "inserted"));

// append an item

PyList_Append(pList, Py_BuildValue("s", "appended"));

// sort the list

PyList_Sort(pList);

// reverse the list

PyList_Reverse(pList);

// fetch and manipulate a list slice

PyObject* pSlice = PyList_GetSlice(pList, 2, 4); // new reference

for(int j = 0; j < PyList_Size(pSlice); ++j) {

PyObject *pValue = PyList_GetItem(pList, j);

assert(pValue);

}

Py_DECREF(pSlice);

// cleanup

Py_DECREF(pList);

2.3.4 字典

Python语言中的字典是一个根据关键字进行访问的数据类型。下面的例子示范了如何在C语言中使用Python的字典类型:

例5:typedic.c

// create the dictionary

PyObject* pDict = PyDict_New(); // new reference

assert(PyDict_Check(pDict));

// add a few named values

PyDict_SetItemString(pDict, "first",

Py_BuildValue("i", 2003));

PyDict_SetItemString(pDict, "second",

Py_BuildValue("f", 3.14f));

// enumerate all named values

PyObject* pKeys = PyDict_Keys(); // new reference

for(int i = 0; i < PyList_Size(pKeys); ++i) {

PyObject *pKey = PyList_GetItem(pKeys, i);

PyObject *pValue = PyDict_GetItem(pDict, pKey);

assert(pValue);

}

Py_DECREF(pKeys);

// remove a named value

PyDict_DelItemString(pDict, "second");

// cleanup

Py_DECREF(pDict);

三、Python的C语言扩展

3.1 模块封装

在了解了Python的C语言接口后,就可以利用Python解释器提供的这些接口来编写Python的C语言扩展,假设有如下一个C语言函数:

例6:example.c

int fact(int n)

{

if (n <= 1)

return 1;

else

return n * fact(n - 1);

}

该函数的功能是计算某个给定自然数的阶乘,如果想在Python解释器中调用该函数,则应该首先将其实现为Python中的一个模块,这需要编写相应的封装接口,如下所示:

例7: wrap.c

#include

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);

}

一个典型的Python扩展模块至少应该包含三个部分:导出函数、方法列表和初始化函数。3.2 导出函数

要在Python解释器中使用C语言中的某个函数,首先要为其编写相应的导出函数,上述例子中的导出函数为wrap_fact。在Python的C语言扩展中,所有的导出函数都具有相同的函数原型:PyObject* method(PyObject* self, PyObject* args);

该函数是Python解释器和C函数进行交互的接口,带有两个参数:self和args。参数self只在C函数被实现为内联方法(built-in method)时才被用到,通常该参数的值为空(NULL)。参数args中包含了Python解释器要传递给C函数的所有参数,通常使用Python的C语言扩展接口提供的函数PyArg_ParseTuple()来获得这些参数值。

所有的导出函数都返回一个PyObject指针,如果对应的C函数没有真正的返回值(即返回值类型为void),则应返回一个全局的None对象(Py_None),并将其引用计数增1,如下所示:PyObject* method(PyObject *self, PyObject *args)

{

Py_INCREF(Py_None);

return Py_None;

}

3.3 方法列表

方法列表中给出了所有可以被Python解释器使用的方法,上述例子对应的方法列表为:

static PyMethodDef exampleMethods[] =

{

{"fact", wrap_fact, METH_VARARGS, "Caculate N!"},

{NULL, NULL}

};

方法列表中的每项由四个部分组成:方法名、导出函数、参数传递方式和方法描述。方法名是从Python解释器中调用该方法时所使用的名字。参数传递方式则规定了Python向C函数传递参数的具体形式,可选的两种方式是METH_VARARGS和METH_KEYWORDS,其中

METH_VARARGS是参数传递的标准形式,它通过Python的元组在Python解释器和C函数之间传递参数,若采用METH_KEYWORD方式,则Python解释器和C函数之间将通过Python的字典类型在两者之间进行参数传递。

3.4 初始化函数

所有的Python扩展模块都必须要有一个初始化函数,以便Python解释器能够对模块进行正确的初始化。Python解释器规定所有的初始化函数的函数名都必须以init开头,并加上模块的名字。对于模块example来说,则相应的初始化函数为:

void initexample()

{

PyObject* m;

m = Py_InitModule("example", exampleMethods);

}

当Python解释器需要导入该模块时,将根据该模块的名称查找相应的初始化函数,一旦找到则调用该函数进行相应的初始化工作,初始化函数则通过调用Python的C语言扩展接口所提供的函数Py_InitModule(),来向Python解释器注册该模块中所有可以用到的方法。

3.5 编译链接

要在Python解释器中使用C语言编写的扩展模块,必须将其编译成动态链接库的形式。下面以RedHat Linux 8.0为例,介绍如何将C编写的Python扩展模块编译成动态链接库:

[xiaowp@gary code]$ gcc -fpic -c -I/usr/include/python2.2 \

-I /usr/lib/python2.2/config \

example.c wrapper.c

[xiaowp@gary code]$ gcc -shared -o example.so example.o wrapper.o

3.6 引入Python解释器

当生成Python扩展模块的动态链接库后,就可以在Python解释器中使用该扩展模块了,与Python自带的模块一样,扩展模块也是通过import命令引入后再使用的,如下所示:[xiaowp@gary code]$ python

Python 2.2.1 (#1, Aug 30 2002, 12:15:30)

[GCC 3.2 20020822 (Red Hat Linux Rawhide 3.2-4)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import example

>>> example.fact(4)

24

>>>

四、结束语

作为一门功能强大的脚本语言,Python将被更加广泛地应用于各个领域。为了克服脚本语言执行速度慢的问题,Python提供了相应的C语言扩展接口,通过将影响执行性能的关键代码用C 语言实现,可以很大程度上提高用Python编写的脚本在运行时的速度,从而满足实际需要。

五、参考资料

1. 可以从Python(https://www.360docs.net/doc/d3807465.html,/)网站着手了解所有关于Python的内容。

2. 可以在Python网站上找到正式的Python C/API文档(https://www.360docs.net/doc/d3807465.html,/doc/current/api/

api.html)。

3. 可以在Python网站上找到正式的编写Python扩展模块的文档(https://www.360docs.net/doc/d3807465.html,/doc/

current/api/api.html)。

六、关于作者

肖文鹏,是北京理工大学计算机系的一名硕士研究生,主要从事操作系统和分布式计算环境的研究,喜爱Linux和Python。你可以通过xiaowp@https://www.360docs.net/doc/d3807465.html,与他取得联系。

Python简介

Python简介[转] Posted on 2008-01-28 23:18 Eric Yih阅读(1324) 评论(0)编辑收藏 1.什么是Python 语言 2.下载和安装 3.基础教程 4.Zope 专题 5.面向对象编程 6.数据库 7.Windows编程 8.多媒体 9.高性能计算 10.网络编程 11.XML 12.图形界面(GUI) 13.开发环境与编辑器 14.嵌入和扩展 15.游戏编程 16.中文编程与文字处理 17.手机移动 18.成功案例与应用 19.书籍文档 20.综合应用 21.精选链接 22.技术支持和服务 什么是Python 语言 Python 语言是一种计算机编程语言,作用类似于c/c++/java/perl/VB/Delphi 等等计算机编程语言,据有非常清晰易读的语法特点,并且是一种高级面向对象的语言,用途非常广泛,并且可以进行扩展。Python 可以运行在Windows,Linux,FreeBSD,Solaris等等几乎所有的电脑中,也可以运行在手机

中,支持Java 和 .Net 技术。Python(派森)语言是一种面向对象的用途非常广泛的编程语言,具有非常清晰的语法特点,适用于多种操作系统,可以在Windows和Unix这样的系统中运行。目前在国际上非常流行,正在得到越来越多的应用。Python可以完成许多任务,功能非常强大。Python核心网站是: https://www.360docs.net/doc/d3807465.html,/,其中你可以找到很多资料。如果您第一次使用Python, 可以下载一个试试。 Python 语言使用方便,不需要进行复杂的编译,用途非常广泛,可以进行各种软件的开发,比如:网站,图形界面(GUI),网络编程,数据库编程,图形图像处理,科学计算,手机编程等等。 使用Python 最多的应该是Google 公司了,就是人们到处都可以看到的Google 搜索引擎。微软公司也已经开始提供Python语言的软件了。全球著名的手机厂商Nokia 公司早已经开始提供基于Python 语言的手机开发软件了。另外,还有很多游戏是用Python开发的。另外一个比较有名的就是Zope 公司了。 目前,Python已经有成百上千的公共资源可以供你调用。 “Python”这个英文单词的发音似“派森”,因此中文可以称之为派森。 举个小例子: Toggle line numbers 1 # -*- coding: utf-8 -*- 2 # 这里是注释 3 import string # 引用模块 4 5 class abc: # 定义类 6 def my(self): # 定义方法 7 hi = '你好,世界' 8 return hi 9 10 def hello(int): # 定义函数或子程序 11 """说明""" 12 if int < 0: # 判断 13 res = '请输入整数'

python的三种选择语句

本文将详细介绍Python语言中的三种选择语句:if语句,if/else语句和if/elif/else语句。对于每种语句,我们都提供了相应的流程图。与此同时,我们给出许多简单的示例程序,以帮助读者加深理解。 一、程序的控制结构 对于Python程序中的执行语句,默认时是按照书写顺序依次执行的,这时我们说这样的语句是顺序结构的。但是,仅有顺序结构还是不够的,因为有时候我们需要根据特定的情况,有选择地执行某些语句,这时我们就需要一种选择结构的语句。另外,有时候我们还可以在给定条件下往复执行某些语句,这时我们称这些语句是循环结构的。有了这三种基本的结构,我们就能够构建任意复杂的程序了。 对本文来说,我们要讨论的是三种基本程序结构中的选择结构,它们分别用if语句、if/else 语句和if/elif/else语句实现。至于其它两种控制结构,我们会在后续的文章中陆续加以介绍。下面我们首先介绍if语句。 二、if语句 Python的if语句的功能跟其他语言的非常相似,都是用来判定给出的条件是否满足,然后根据判断的结果(即真或假)决定是否执行给出的操作。If语句是一种单选结构,它选择的是做与不做。它是由三部分组成:关键字if本身、测试条件真假的表达式(我们简称为条件表达式)和表达式结果为真(即表达式的值为非零)时要执行的代码。If语句的语法形式如下所示: if表达式: 语句体 if语句的流程图如下所示: 图1if语句的流程示意图 注意,if语句的语句体只有当条件表达式的值为真,即非零时,才会执行;否则的话,程序就会直接跳过这个语句体,去执行紧跟在这个语句体之后的语句。我们这里的语句体,既可

1. Python简介

Python简介 339次阅读 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。 现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种。如果你听说过TIOBE排行榜,你就能知道编程语言的大致流行程度。这是最近10年最常用的10种编程语言的变化图: 总的来说,这几种编程语言各有千秋。C语言是可以用来编写操作系统的贴近硬件的语言,所以,C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。 当你用一种语言开始作真正的软件开发时,你除了编写代码外,还需要很多基本的已经写好的现成的东西,来帮助你加快开发进度。比如说,要编写一个电子邮件客户端,如果先从最底层开始编写网络协议相关的代码,那估计一年半载也开发不出来。高级编程语言通常都会

提供一个比较完善的基础代码库,让你能直接调用,比如,针对电子邮件协议的SMTP库,针对桌面环境的GUI库,在这些已有的代码库的基础上开发,一个电子邮件客户端几天就能开发出来。 Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。 除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。 许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。 龟叔给Python的定位是“优雅”、“明确”、“简单”,所以Python程序看上去总是简单易懂,初学者学Python,不但入门容易,而且将来深入下去,可以编写那些非常非常复杂的程序。 总的来说,Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写少的代码。如果一个资深程序员向你炫耀他写的晦涩难懂、动不动就几万行的代码,你可以尽情地嘲笑他。 那Python适合开发哪些类型的应用呢? 首选是网络应用,包括网站、后台服务等等; 其次是许多日常需要的小工具,包括系统管理员需要的脚本任务等等; 另外就是把其他语言开发的程序再包装起来,方便使用。 最后说说Python的缺点。 任何编程语言都有缺点,Python也不例外。优点说过了,那Python有哪些缺点呢? 第一个缺点就是运行速度慢,和C程序相比非常慢,因为Python是解释型语言,你的代码在执行时会一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是运行前直接编译成CPU能执行的机器码,所以非常快。 但是大量的应用程序不需要这么快的运行速度,因为用户根本感觉不出来。例如开发一个下载MP3的网络应用程序,C程序的运行时间需要0.001秒,而Python程序的运行时间需要0.1秒,慢了100倍,但由于网络更慢,需要等待1秒,你想,用户能感觉到1.001秒和1.1秒的区别吗?这就好比F1赛车和普通的出租车在北京三环路上行驶的道理一样,虽然F1赛车理论时速高达400公里,但由于三环路堵车的时速只有20公里,因此,作为乘客,你感觉的时速永远是20公里。

Python 简介

Python 简介 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。 ?Python 是一种解释型语言:这意味着开发过程中没有了编译这个环节。类似于PHP和Perl 语言。 ?Python 是交互式语言:这意味着,您可以在一个Python提示符,直接互动执行写你的程序。?Python 是面向对象语言:这意味着Python支持面向对象的风格或代码封装在对象的编程技术。 ?Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到WWW 浏览器再到游戏。 Python 发展历史 Python 是由Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。 Python 本身也是由诸多其他语言发展而来的,这包括ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。 像Perl 语言一样,Python 源代码同样遵循GPL(GNU General Public License)协议。 现在Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。 Python 特点 ? 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。 ? 2.易于阅读:Python代码定义的更清晰。 ? 3.易于维护:Python的成功在于它的源代码是相当容易维护的。

Python的简介

Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。 现在,全世界差不多有600多种编程语言,但流行的编程语言也就那么20来种。如果你听说过TIOBE排行榜,你就能知道编程语言的大致流行程度。这是最近10年最常用的10种编程语言的变化图: 总的来说,这几种编程语言各有千秋。C语言是可以用来编写操作系统的贴近硬件的语言,所以,C语言适合开发那些追求运行速度、充分发挥硬件性能的程序。而Python是用来编写应用程序的高级编程语言。 当你用一种语言开始作真正的软件开发时,你除了编写代码外,还需要很多基本的已经写好的现成的东西,来帮助你加快开发进度。比如说,要编写一个电子邮件客户端,如果先从最底层开始编写网络协议相关的代码,那估计一年半载也开发不出来。高级编程语言通常都会 提供一个比较完善的基础代码库,让你能直接调用,比如,针对电子邮件协议的SMTP库,针对桌面环境的GUI库,在这些已有的代码库的基础上开发,一个电子邮件客户端几天就能开发出来。 Python就为我们提供了非常完善的基础代码库,覆盖了网络、文件、GUI、数据库、文本等大量内容,被形象地称作“内置电池(batteries included)”。用Python开发,许多功能不必从零编写,直接使用现成的即可。 除了内置的库外,Python还有大量的第三方库,也就是别人开发的,供你直接使用的东西。当然,如果你开发的代码通过很好的封装,也可以作为第三方库给别人使用。 许多大型网站就是用Python开发的,例如YouTube、Instagram,还有国内的豆瓣。很多大公司,包括Google、Yahoo等,甚至NASA(美国航空航天局)都大量地使用Python。

Python 介绍

Python 介绍 Python(KK 英语发音:/'pa?θɑn/, DJ 英语发音:/?paiθ?n/)是一种面向对象、直译式计算机程序设计语言,创始人为Guido van Rossum。这种语言的语法简捷而清晰,并且具有丰富和强大的类库。python常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。常见的一种应用情形是,使用python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,速度要求非常高,就可以用C++重写。 产生 Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido 为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承。之所以选中Python(大蟒蛇的意思)作为程序的名字,是因为他是一个Monty Python的飞行马戏团的爱好者。 ABC是由Guido参加设计的一种教学语言。就Guido本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是ABC语言并没有成功,究其原因,Guido 认为是非开放造成的。Guido 决心在Python 中避免这一错误。同时,他还想实现在ABC 中闪现过但未曾实现的东西。 就这样,Python在Guido手中诞生了。实际上,第一个实现是在Mac机上。可以说,Python是从ABC发展起来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计的)的影响。并且结合了Unix shell和C的习惯。 执行 Python在执行时,首先会将.py文件中的源代码编译成Python的byte code(字节码),然后再由Python Virtual Machine来执行这些编译好的byte code。这种机制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine与Java或.NET的Virtual Machine 不同的是,Python的Virtual Machine是一种更高级的Virtual Machine。这里的高级并不是通常意义上的高级,不是说Python的Virtual Machine比Java或.NET的功能更强大,而是说和Java 或.NET相比,Python的Virtual Machine距离真实机器的距离更远。或者可以这么说,Python的Virtual Machine是一种抽象层次更高的Virtual Machine。 基于C的Python编译出的字节码文件,通常是.pyc格式。 风格 Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。Python直接编写的程序段有时运行效率甚至高于用C编写的程序。

相关主题
相关文档
最新文档