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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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