Python真的比其他语言慢吗

python.jpeg

为什么Python会比其它语言慢?

Python是动态类型语言而不是静态类型语言。

这意味着在程序执行的时候,解释器不知道被定义的变量的类型。下图总结了一个C变量(我使用C作为编译语言的替代品)和一个Python变量之间的区别:


C和Python.png
/* c代码实例 */
int a =1; // 将整型数1赋值给a
int b = 2; // 将整型数2赋值给b
int c = a + b; // 调用binary_add<int,int>(a,b),并将结果分配给c

C编译器一开始就知道a和b是整数,直接调用两个整数添加的方法,返回C这个整数存到内存当中。整个代码就运行 完毕了。

# python代码实例
a = 1
b = 2
c = a + b

如上代码所示,Python运行完上述代码需要经过以下几个步骤:

  • 将1分配给a:设置a的a->PyObject_HEAD->typecode为整型,然后设置a的值为1。
  • 将2分配给b:设置b的b->PyObject_HEAD->typecode为整型,然后设置b的值为2。
  • 调用binary_add(a,b):在a->PyObject_HEAD找到typecode,a是整数,值为1;在b>PyObject_HEAD找到typecode,b是整数,值为2。调用binary_add<int,int>(a->val,b->val),返回结果,是一个整数。
  • 创建一个Python对象c:设置c-> PyObject_HEAD ->typecode为整数,将c->val设置为3步骤中返回的结果。

大家从上述步骤不难看出,动态类型语言,任何操作都涉及到很多的操作,这是Python对数值操作比C慢的主要原因。

Python是解释型语言而不是编译型语言。

从上面我们看到了解释代码和编译代码之间的一个区别。优秀的编译器可以优化重复和不需要的操作,这使得它速度快。

Python的对象模型会导致内存效率较低

当我们想存储若干整数时,Python可能会使用list对象,而在C中,会使用基于某种缓冲区的数组。

比如最简单形式的NumPy数组是围绕C数组构建的Python对象,也就是说,它有一个指向值的连续缓冲数据区的指针,每一个指针指向一个Python对象,该对象又饮用其数据,如图所示:


Python.3png.png

从上图不难看出,如果进行顺序执行数据的操作,那么numpy将比python在存储和访问上更有效率。

Python效率这么低,为什么我们还要使用它?

  • Python的动态类型使得Python比C更加容易使用,它非常的灵活,这种灵活性可以有效的利用我们的开发时间,在真正需要优化的时候,我们可以使用Python内置的库对其进行优化,这就是为什么在科学研究中,Python的使用率一直在不断增长,Python是用代码进行科学研究的一门非常有效的语言。

  • 许多Python程序慢,是没有利用Python及其标准库中提供的功能,在数学和统计科学运算方面可以使用NumPy和Pandas等库提升速度,PyPy运行时(解释器的一种,默认解释器是CPython,是一个Python的JIT实现,只需通过用PyPy替换CPython)可以为许多Python程序提供数量级的加速。比如为我们长时间运行的Web服务器加速。

  • 在我们开发的程序中,一个程序90%的运算往往在10%的代码中,所以针对这10%的代码进行优化可以大大提高我们程序的运行效率。在Python中,我们可以选择将这10%的代码通过Cython或Numba等项目转换成C或者若干程序集。

  • Cython是Python的超集,几乎是Python和C的合并,是一种渐进式语言,任何Python代码都是有效的Cython代码。Cython代码编译成C代码,使用Cython,我们可以编写一个模块或方法,让其具有C的类型和性能。混合使用C类型和Python类型。通过Cython,我们可以让我们的程序进行进一步的优化,并且具有Python的优点。

开发人员的时间效率,一个py程序可能需要6s时间,而C可能只需要1s。但开发人员使用Python可能只需要10分钟就能完成这个程序。而使用C语言你可能需要1个小时或者更多。


从上面不难看出,可能对于吞吐量比较大,并发需求较低但软件,Python不太适合。但从系统管理到目前非常火热的机器学习领域,Python显然是非常合适的语言。当要求应用开发速度以及开发人员时间有限的情况下,使用Python无疑是非常好的一个选择!

好了,本篇文章就给大家介绍到这里,喜欢我到文章的朋友可以点击【关注】。欢迎大家留言交流。最后放上:

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

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,327评论 0 17
  • C++调用python 在C/C++中嵌入Python,可以使用Python提供的强大功能,通过嵌入Python可...
    Bruce_Szh阅读 13,701评论 1 7
  • 十万大山是这个世界最傻、最呆、最可怜的大山他们傻傻的站着这一站就是亿万年像恒久不变的士兵方阵随时在等待着冲锋的号角
    刘汉皇阅读 229评论 0 2
  • 我亲爱的笑笑, 我放下了所以的情绪,我也安抚了自己好久,当我写下亲爱的笑笑的时候,我确认我已经怀着一颗爱你的心来写...
    Graciegu阅读 156评论 4 3
  • 第二天早上7点钟我就醒了,起床悄悄的拉开窗帘一角向外望去(以后,这好像变成我在沙巴早晨起床的固定动作),窗外似乎下...
    红豆汉堡阅读 203评论 2 1