python的执行速度比编译型慢吗,Python真的比其他语言慢吗

7792a332ca98

python.jpeg

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

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

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

7792a332ca98

C和Python.png

/* c代码实例 */

int a =1; // 将整型数1赋值给a

int b = 2; // 将整型数2赋值给b

int c = a + b; // 调用binary_add(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(a->val,b->val),返回结果,是一个整数。

创建一个Python对象c:设置c-> PyObject_HEAD ->typecode为整数,将c->val设置为3步骤中返回的结果。

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

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

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

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

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

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

7792a332ca98

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无疑是非常好的一个选择!

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

7792a332ca98

python之禅.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值