文档章节

谁是速度之王(Python vs JavaScript)?

开心303
 开心303
发布于 2012/03/20 12:42
字数 875
阅读 3361
收藏 1
Python 是个比较成熟的语言,运行速度在几年前是快于 JavaScript 的。但这些年  
JavaScript 的解释器发展很快,特别是 Google 的 V8 和 Mozilla 的 SpiderMonkey,  
将 JavaScript 的运行速度提升了一大块,以致 JavaScript 的运行速度大有反超 Python  
之势,但 Python 也不甘示弱,PyPy 项目经过几年的开发之后,最近也在频频发布版本,  
将 JIT 带到 Python 之中,所以谁比谁牛,还很难说。这里做个简单的测试:  

测试环境:  
CPU:            Intel(R) Pentium(R) CPU G620 @ 2.60GHz 双核  
操作系统:       Debian GNU/Linux 6.0 64 位  
Google JS 引擎: 来自 Node.js v0.6.12 (命令:node)  
Mozilla JS 引擎:来自 xulrunner-11.0 (命令:xpcshell)  
Python:         Debian 自带的 Python 2.6.6 (命令:python)  
PyPy:           pypy-1.8 (命令:pypy)  

先测试简单的循环累加,测试代码:  

testSum.js
var i, j, s;

for (i = 0; i < 100; i++) {
    s = 0;
    for (j = 0; j < 100000; j++)
        s += j;
}

if ('function' == typeof(print))
    print(i, s);
else
    console.log(i, s);

testSum.py

i = 0
while i < 100:
    s = 0
    j = 0
    while j < 100000:
        s += j
        j += 1
    i += 1

print i, s

测试结果:
time node testSum.js     : 0m0.052s
time xpcshell testSum.js : 0m1.808s
time python testSum.py   : 0m2.199s

time pypy testSum.py     : 0m0.188s


再测试 Dict 操作,测试代码:

testDict.js

var D = {};

var i, s, k;

for (i = 0; i < 100000; i++)
    D['k' + i] = i;

for (i = 0; i < 100; i++) {
    s = 0;
    for (k in D)
        s += D[k];
}

if ('function' == typeof(print))
    print(i, s);
else
    console.log(i, s);

testDict.py

D = {}

i = 0
while i < 100000:
    D['k%d' % i] = i
    i += 1

i = 0
while i < 100:
    s = 0
    for k in D:
        s += D[k]
    i += 1

print i, s

测试结果: 
time node testDict.js     : 0m3.645s 
time xpcshell testDict.js : 0m2.894s 
time python testDict.py   : 0m2.954s 
time pypy testDict.py     : 0m1.044s 

继续测,测试 List 操作,测试代码: 

testList.js

var L = [];

var i, k;

for (i = 0; i < 100000; i++)
    L.push('k' + i);

for (i = 0; i < 100000; i++) {
    if (i & 1) {
        k = L.shift();
        L.splice(i, 0, k);
    } else {
        k = L.splice(i, 1)[0];
        L.push(k);
    }
}

if ('function' == typeof(print))
    print(i, L.length);
else
    console.log(i, L.length);

testList.py

L = []

i = 0
while i < 100000:
    L.append('k%d' % i)
    i += 1

i = 0
while i < 100000:
    if i & 1:
        k = L[0]
        del L[0]
        L.insert(i, k)
    else:
        k = L[i]
        del L[i]
        L.append(k)
    i += 1

print i, len(L)

测试结果:
time node testList.js     : 0m5.277s
time xpcshell testList.js : 3m10.457s
time python testList.py   : 0m6.710s
time pypy testList.py     : 0m41.702s

测试总结:
循环累加操作:node     < pypy     < xpcshell  < python
              0m0.052s   0m0.188s   0m1.808s    0m2.199s

Dict 操作:   pypy     < xpcshell < python    < node
              0m1.044s   0m2.894s   0m2.954s    0m3.645s

List 操作:   node     < python   < pypy      < xpcshell
              0m5.277s   0m6.710s   0m41.702s   3m10.457s

    经过简单的测试表明:
    Node.js 做单纯的运算无疑是最快的,但 Node.js 的 Dict 操作性能太差,List 操
作却又是表现最好的。
    xpcshell 做单纯的运算慢于 Node.js,做 Dict 运算快于 Node.js,但做 List 操作
却是慢的离谱,是最慢的。
    python 做单纯的运算是最慢的,Dict 操作表现还不错,List 操作表现也不错,个人
感觉只要不是做大量的计算,还是比较适合实现复杂的业务逻辑的。
    PyPy 做单纯的计算表现不俗,做 Dict 操作性能最好,但是做 List 操作还不如传统
的 Python,个人感觉 PyPy 很有前途,但在某些地方或许还不够成熟。可以考虑在某些环
境代替标准的 Python,毕竟两者是非常兼容的,可以互相替换。

    最后的总结:
    Node.js 在适合的环境会表现的很好,但不要过度使用。
    Python 作为一门成熟的语言,不容忽视,在复杂的环境下,或许 Python 也是好的选
择。
    作为语言的使用者,我们可以多了解几门语言,了解各自的优缺点,在适合的地方,
将适合的语言派上用场。

本文转载自:http://my.oschina.net/raymin/blog/49765

共有 人打赏支持
开心303
粉丝 144
博文 89
码字总数 107400
作品 0
闵行
CTO(技术副总裁)
Python 与 Javascript 之比较

最近由于工作的需要开始开发一些Python的东西,由于之前一直在使用Javascript,所以会不自觉的使用一些Javascript的概念,语法什么的,经常掉到坑里。我觉得对于从Javascript转到Python,有必...

naughty
2014/05/13
0
39
JavaScript学习笔记009-json对象0解构赋值

Author:Mr.柳上原 付出不亚于任何的努力 愿我们所有的努力,都不会被生活辜负 不忘初心,方得始终 后端学院的老师来我们前端学院推广Python 为期一个星期的Python基础课 有些刚学html的学弟...

Mr柳上原
08/16
0
0
关于Python的类成员和Javascript的原型

偶然发现两个的设计思路是一致的(个人理解,欢迎指正)。这里简要分析一下: Python的类成员,也就是直接定义在类里的变量(实例成员是用self.x直接声明的),而类方法就是用@classmethod说...

Shawphy
2011/08/30
0
2
利用Ajax提升网页渲染速度——以Highcharts为例

先来看看速度优化对比 Django响应请求 在Django的视图模块中, 响应ajax请求, 处理完毕后发送回前端 参考资料 关于HighCharts的Ajax例子可以参考官方文档 点击查看 菜鸟教程 点击查看 还在修改...

謝增光_Feson
05/24
0
0
requests库入门06-post请求

示例相应的接口文档:GitHub邮箱接口文档 先登录GitHub,然后右上角用户下拉框中选择settings,然后选Emails。可以看到当前账户设置的邮箱情况 再看添加邮箱接口的文档描述,可以通过一个str...

梦忆安凉
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

arts-week10

Algorithm 905. Sort Array By Parity - LeetCode Review Who’s Afraid of the Big Bad Preloader? 一文读懂前端缓存 一个网络请求3个步骤:请求,处理,响应,而前端缓存主要在请求处响应这两步...

yysue
49分钟前
0
0
00.编译OpenJDK-8u40的整个过程

前言 历经2天的折腾总算把OpenJDK给编译成功了,要说为啥搞这个,还得从面试说起,最近出去面试经常被问到JVM的相关东西,总感觉自己以前学的太浅薄,所以回来就打算深入学习,目标把《深入理...

凌晨一点
今天
4
0
python: 一些关于元组的碎碎念

初始化元组的时候,尤其是元组里面只有一个元素的时候,会出现一些很蛋疼的情况: def checkContentAndType(obj): print(obj) print(type(obj))if __name__=="__main__": tu...

Oh_really
昨天
6
2
jvm crash分析工具

介绍一款非常好用的jvm crash分析工具,当jvm挂掉时,会产生hs_err_pid.log。里面记录了jvm当时的运行状态以及错误信息,但是内容量比较庞大,不好分析。所以我们要借助工具来帮我们。 Cras...

xpbob
昨天
126
0
Qt编写自定义控件属性设计器

以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用...

飞扬青云
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部