大约在一年前,也就是2013年在Waza(地名),Alex Gaynor提到了一个很好的话题:为什么用Python、Ruby和Javascript写的程序总是运行的很慢呢?正如他强调的,关键就是现在出现了这个问题。换一句话说,尽管现在这种语言很慢,但不意味着没有解决办法,不意味着未来会一直这样。

当在网上问为什么Python比C语言更慢,回答最多的就是Python中有动态类型。然而,动态类型确实会在性能方面有影响,但是这并不是主要原因。

动态类型(像Python一样的主要编程语言都一样)使得编译器很难优化性能。动态使得每次执行都可能很不同,编译器难以优化。然而,正如Alex在谈话中提到的,我们花费了数年的时间来研究究竟在运行时进行类型检查的最好的办法是什么。但是没什么进展。

在现实中,在C语言和Python在运行时的巨大的不同是由于数据结构和算法的不同。有时程序员也没有注意到这一点。

用Python写不同的代码

让我们用一个Alex提到的实例来说明问题。一个Python程序员可能很喜欢用下面的例子表示一个平面上的点:

这种方法很易读,容易编码,形式很优雅。

另一个方面,一个C语言程序员可能使用结构体来表示平面上的点:

尽管这种方法也和Python能一样的工作并且都是很优雅的,但这是完全不同的数据结构。这里我们告诉了编译器,我们有两个字段x和y。知道了这两个字段的类型,编译器将分配一块连续的内存来储存这两个数据。换一句话说,就像一个数组一样。任何时间,编译器都知道给定的x和y在哪里。我们可以很容易地访问这些数据,就像是访问某些常数据一样。

Python使用哈希散列的方法来解决类似的问题。所以编译器不能简单地分配连续内存存储x和y来处理这些问题。由于我们在其中任意的地方都可能出现这些键。如果我们想的话,我们也可能删除这些键。编译器必须要使用哈希函数来映射到你可能让他指向的任何存储单元。不用说,这些函数增加了处理时间。尽管也许减缓的很小,但是足可以拖慢你的代码,尤其是这种情况如果很多的时候。

如果就是想将Python翻译成C语言的话,可能就像下面这样:

看这个代码片段,好像就是语言的设计者他们自己故意尽力使哈希表复杂,因此尽管是正确的,但没有人使用。由于这个原因,写C语言的人可能认为这是不可思议的,但为什么在Python就是可以接受的呢?

原因就是写Python代码的人的“dictionaries are lightweight objects”这种心态。看下面的代码,这在Python中最接近C语言结构体:

这对编译器是有用的,就像是C语言的结构体。例如第二行,我们明确告诉编译器但我们创造一个对象时我们总是至少需要两个数据段,我们希望编译器处理这个问题。

不幸的是这种标准的Python被叫做CPthon,不能总被使用。在我的机器上,下面的代码要执行186毫秒:

在我的机器上,用point.x代替point['x']会花费201毫秒。也就是说,会慢了8%。

在CPthon中,point.x通常就是被处理成dict(point)['x']。这意味着带着点的class仍然像以前一样使用字典(dictionary)的方法查找。这样的话,就很容易看出为什么directionary的方法被看为“轻量级的”。

一些Python写的代码就是为了效率而设计的,例如PyPy,能很快地执行。如果不使用Python而是使用PyPy,同样的代码片段执行时间分别是21.6和3.75毫秒。这种方法相比CPython在JIT-capable编译情况下结果都是令人满意的。换一句话说,PyPy能正确地使用数据结构。

我希望你再一次看这个最短时间3.75毫秒。这个数字表明我们能在一秒进行266000次运算,这些事来自Python的,其中有动态绑定,monkey-patching(在不改变源代码的情况下扩展或修改动态语言运行时代码的方法)等。所有的这些,都是在编码和实现中使用了更好的数据结构。下一次当你在用Python写一行代码时,想一想你在使用什么数据结构,显示的还是隐式的,考虑一下是否有更好的办法。这就是你用C语言写程序时考虑的,不是吗?

最后,我愿意相信这个文章是表明为什么Python是一个有前途的语言的一个清楚的例子(或者是类似的语言)。这表明了标准的Python实现,这里的CPython仅仅是作为一个参考,它从来就不是被设计用来更快地执行的。正如我们今天可以看到的,像PyPy一样的算法实现是可以优化你的代码到一个很好的长度。随着语言的自然发展,这些优化是可能的。我们仅仅用Python编程过23年,那么如果像C语言一样有42年的发展,Python会是什么样子呢?

1、有人也许会争辩说collections.namedtuple()是更接近于C语言的结构体,这是对的,但我们不要过分将事情复杂化,我们的重点是有效。

2、为了更清楚python是怎样工作的,请参考python文档。

python执行速度太慢为什么还_为什么你写的Python运行的那么慢呢?相关推荐

  1. python的开发者太负责任了_人生苦短,我用 Python

    我接触 Python 并不算早,第一次使用 Python 写生产系统的程序是2004年,那时候我已经有了几年的编程经验.当然了,现在这年头说早晚都不合适,昨天我说2000年就开始使用 Vim 编程了, ...

  2. 云服务器上传文件怎么这么慢,百度云上传速度太慢怎么回事_百度云网盘上传速度太慢怎么解决-win7之家...

    百度云是百度推出的一项云存储服务,给用户们提供文件的网络备份.同步和分享服务,不过最近有用户发现百度云要上传资料的时候发现速度太慢了,这是怎么回事呢,针对这个问题,小编给大家讲解一下百度云网盘上传速度 ...

  3. python那么慢为什么还有人用-Python执行效率慢,为什么还这么火?【黑马程序员】...

    稍微了解python的同学,都知道python比起java这类编译型语言来说执行效率比较低,可是为什么python依然这么火呢? Python是一门解释型的动态语言,由于语言的解释执行的过程和动态类型 ...

  4. python任意代码都可以缩进去_我发现了个 Python 黑魔法,执行任意代码都会自动念上一段 『平安经』...

    最近的"平安经"可谓是引起了不小的风波啊. 作为一个正儿八经的程序员,最害怕的就是自己的代码上线出现各种各样的 BUG. 为此,明哥今天分享一个 Python 的黑魔法,教你如何在 ...

  5. python 去掉list元素的双引号_一天快速入门 Python

    Python 是由Guido Van Rossum在 90 年代早期设计,现在是最常用的编程语言之一.特别是人工智能的火热,再加之它的语法简洁且优美,实乃初学者入门AI必备的编程语言. Python基 ...

  6. python函数和方法的编写原则_跟老齐学Python之传说中的函数编写条规

    关于函数的事情,总是说不完的,下面就罗列一些编写函数的注意事项.特别声明,这些事项不是我总结的,我是从一本名字为<Learning Python>的书里面抄过来的,顺便写成了汉语,当然,是 ...

  7. python零基础入门五小时教学_五小时轻松入门Python

    Python 是由Guido Van Rossum在 90 年代早期设计,现在是最常用的编程语言之一.特别是人工智能的火热,再加之它的语法简洁且优美,实乃初学者入门AI必备的编程语言. Python基 ...

  8. python两数相加有进退位_仁裁者、Python之父Guido“退位”,python何去何从?

    10月30日,Python之父Guido大牛宣布退休,离开Dropbox.他发推文说,"这件事感觉既苦涩又甜蜜:苦涩的是,我马上要离开Dropbox,现在已经退休:甜蜜的是,在Dropbox ...

  9. python抓取网页数据并截图_网络爬虫-使用Python抓取网页数据

    搬自大神boyXiong的干货! 闲来无事,看看了Python,发现这东西挺爽的,废话少说,就是干 准备搭建环境 因为是MAC电脑,所以自动安装了Python 2.7的版本 添加一个 库 Beauti ...

最新文章

  1. java initcause_Java 异常
  2. 【探讨】javascript事件机制底层实现原理
  3. 卫星覆盖分析品质 FOM
  4. 【洞见】关于PMP个人认识和理解
  5. Golang 入门笔记(一)
  6. Vue学习笔记(1)(认识Vue、基础语法)
  7. bzoj4565 [HAOI2016]字符合并 结论+状压+区间dp
  8. Matlab学习记录 1
  9. linux 同一个ip 绑定两个不同的域名 访问两个不同的项目
  10. Android 开机logo支持的格式
  11. python儿童编程入门-一款儿童编程入门的理想工具——PythonTurtle
  12. 电脑连接热点无internet访问权限_连接wifi后显示无internet访问权限怎么解决
  13. 菜肴百度百科html,酸汤鱼
  14. MongoDB实战(MongoDB开发者现身说法)
  15. Linux 服务器配置 ASF 云挂卡
  16. 不一样的类小草图形写法
  17. 制作stlink(烧录部分)
  18. git did not exit cleanly(exit code 128)报错的部分原因及解决方法
  19. 计算机应用词汇,计算机应用常用英语词汇 1
  20. 【干货】软件安装报“不能注册DLL/OCX:RegSvr32失败;退出代码Ox3”

热门文章

  1. Android系统音量范围0-100,步进值5(十三)
  2. 区块链架构与应用(区块链入门篇)
  3. android Camera相关问题及NV12剪裁旋转
  4. SpringBoot之mybatis-plus
  5. centos之ctrl+z
  6. mark点Z3学习资料整理
  7. TCP/IP协议详解、TCP三次握手
  8. ws配置 zuul_微服务网关 Spring Cloud Gateway
  9. windows系统bat批处理 电脑换IP清空dns地址 清空缓存重新获取ip
  10. Linux排查java程序CPU占用过高问题