Python 运行速度慢原因之一一因为它是动态类型语言

“静态类型”语言要求必须在变量定义时指定其类型,例如C、C++、Java、C#和Go等。

而动态类型语言中尽管也有类型的概念,但变量的类型是动态的。

a = 1a = "foo"

在这个例子中,Python用相同的名字和str类型定义了第二个变量,同时释放了第一个a的实例占用的内存。

静态类型语言的设计目的并不是折磨人,这样设计是因为CPU就是这样工作的。如果任何操作最终都要转化成简单的二进制操作,那就需要将对象和类型都转换成低级数据结构。

Python帮你做了这一切,只不过你从来没有关心过,也不需要关心。

不需要定义类型并不是Python慢的原因。Python的设计可以让你把一切都做成动态的。你可以在运行时替换对象的方法,可以在运行时给底层系统调用打补丁。几乎一切都有可能。

而这种设计使得Python的优化变得很困难。

为了演示这个观点,我使用了一个Mac OS下的系统调用跟踪工具,叫做Dtrace。CPython的发布并不支持DTrace,因此需要重新编译CPython。演示中用的是Python 3.6.6:

wget https://github.com/python/cpython/archive/v3.6.6.zipunzip v3.6.6.zipcd v3.6.6./configure --with-dtracemake

现在Python.exe的代码中包含了Dtrace的跟踪代码。Paul Ross有一篇非常好的关于DTrace的演讲(https://github.com/paulross/dtrace-py#the-lightning-talk)。可以从这里下载DTrace用于Python的文件(https://github.com/paulross/dtrace-py/tree/master/toolkit)用来测量函数调用、执行时间、CPU时间、系统调用以及各种函数等等。

sudo dtrace -s toolkit/<tracer>.d -c ‘../cpython/python.exe script.py’

py_callflow跟踪器会显示应用程序的所有函数调用。

那么,Python的动态类型是否让Python更慢?比较并转换类型的代价很大。每次读取、写入或引用变脸时都会检查类型动态类型的语言很难优化。许多替代Python的语言很快的原因就是它们牺牲了便利性来交换性能。例如Cython(http://cython.org/),它通过结合C的静态类型和Python的方式,使得代码中的类型已知,从而优化代码,能够获得84倍的性能提升(http://notes-on-cython.readthedocs.io/en/latest/std_dev.html)

结论

Python慢的主要原因是因为它的动态和多样性。它能用于解决各种问题,但多数问题都有优化得更好和更快的解决方案。

但Python应用也有许多优化措施,如使用异步、理解性能测试工具,以及使用多解释器等。

对于启动时间不重要,而代码可能享受到JIT的好处的应用,可以考虑使用PyPy。

对于代码中性能很重要的部分,如果变量大多是静态类型,可以考虑使用Cython。

进QQ群(779809018)免费领取学习资源,疑难问题解答。同时欢迎大家关注我的微信公众号:代码帮 ,免费领取学习资源。

本公众号将秉持活到老学到老学习无休止的交流分享开源精神,汇聚于互联网和个人学习工作的精华干货知识,一切来于互联网,反馈回互联网。
目前研究领域:大数据、机器学习、深度学习、人工智能、数据挖掘、数据分析。 语言涉及:Java、Scala、Python、Shell、Linux等 。同时还涉及平常所使用的手机、电脑和互联网上的使用技巧、问题和实用软件破解。 只要你一直关注和呆在群里,每天必须有收获,讨论和答疑QQ群:大数据和人工智能总群(779809018)微信公众号(代码帮)每天分享最新IT、大数据和人工智能新技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值