python
为什么python会比其它语言慢?
python是动态类型语言而不是静态类型语言。
这意味着在程序执行的时候,解释器不知道被定义的变量的类型。下图总结了一个c变量(我使用c作为编译语言的替代品)和一个python变量之间的区别:
c变量和python变量
/* 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. 将1分配给a:设置a的a->pyobject_head->typecode为整型,然后设置a的值为1。
2. 将2分配给b:设置b的b->pyobject_head->typecode为整型,然后设置b的值为2。
3. 调用binary_add(a,b):在a->pyobject_head找到typecode,a是整数,值为1;在b>pyobject_head找到typecode,b是整数,值为2。调用binary_add(a->val,b->val),返回结果,是一个整数。
4. 创建一个python对象c:设置c-> pyobject_head ->typecode为整数,将c->val设置为3步骤中返回的结果。
大家从上述步骤不难看出,动态类型语言,任何操作都涉及到很多的操作,这是python对数值操作比c慢的主要原因。
python是解释型语言而不是编译型语言。
从上面我们看到了解释代码和编译代码之间的一个区别。优秀的编译器可以优化重复和不需要的操作,这使得它速度快。
python的对象模型会导致内存效率较低。
当我们想存储若干整数时,python可能会使用list对象,而在c中,会使用基于某种缓冲区的数组。
比如最简单形式的numpy数组是围绕c数组构建的python对象,也就是说,它有一个指向值的连续缓冲数据区的指针,每一个指针指向一个python对象,该对象又饮用其数据,如图所示:
numpy array 和 python list
从上图不难看出,如果进行顺序执行数据的操作,那么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之禅