刚才测试了一下 Node.js 与 python 的计算性能,震惊了

2014-05-23 10:10:25 +08:00
 codingpp
测试脚本之一,是计算40位的斐波那契数列,测试脚本如下:
node.js
function fibo (n) {
return n > 1 ? fibo(n - 1) + fibo(n - 2) : 1;
}
console.log(fibo(40));

python
def fibo(n):
return fibo(n - 1) + fibo(n - 2) if n > 1 else 1
print fibo(40)

php
<?php
function fibo($n){
if($n > 1) {
return fibo($n - 1) + fibo($n - 2);
} else {
return 1;
}
}
echo fibo(40);

测试结果如下:

node.js
real 0m3.329s
user 0m3.318s
sys 0m0.010s

python
real 1m11.325s
user 1m11.259s
sys 0m0.015s

php
real 1m26.551s
user 1m26.448s
sys 0m0.027s


node.js居然比python快了23倍之多

之后我又写了一个测试脚本,就是简单的循环
i = 0
t = 1
while(i < 50000000):
t = t + i
i += 1
print t

node.js居然比python快了70多倍。。比php快了16倍,c语言也比node.js慢了一点点

虽然也知道python慢,但是这个差的有点多啊
58307 次点击
所在节点    Python
105 条回复
Paranoid
2014-05-23 10:17:02 +08:00
真巧, 刚刚看书刚好看到 斐波那契 这块, LZ 算法还可以被优化. 利用自底向上的动态规划来保存需要前置的值在进行计算. 时间从指数级变成线性.
nigelvon
2014-05-23 10:18:41 +08:00
@Paranoid 恩,递归常见优化思路
qloog
2014-05-23 10:23:16 +08:00
看来V8还是挺厉害的,比想象的厉害~ python居然差这么多。。。
song940
2014-05-23 10:27:57 +08:00
Python 不是会生成 *.pyc 文件么 , 这对 Python 执行速度没有帮助 ?
mengzhuo
2014-05-23 10:30:50 +08:00
mengzhuo
2014-05-23 10:33:21 +08:00
Python递归还是少用为妙,太多就max deep了,换成stackless或者pypy可以性能翻3倍
duzhe0
2014-05-23 10:35:14 +08:00
以前miloyip做过一个渲染测试,javascript(V8)是脚本语言里最快的
http://www.cnblogs.com/miloyip/archive/2010/07/07/languages_brawl_GI.html
zoowii
2014-05-23 10:36:34 +08:00
v8里自带了缓存?
你用每次计算都是不同的值来比较下呢,比如每次加大随机数循环
fwee
2014-05-23 10:41:09 +08:00
http://www.techempower.com/benchmarks/

接近实际的测试中表现是差不多的
xdeng
2014-05-23 10:41:46 +08:00
后面的那个脚本会被优化掉的
skybr
2014-05-23 10:42:24 +08:00
js的数值运算不带gmp支持, python的带, 这个测试一开始就不公平.

跑这种应该用pypy的, 目前看, 只要预热足够, pypy的性能是高于node的.

@song940 主要提升加载速度, pyo可以去掉assert
zog
2014-05-23 10:48:24 +08:00
这样试一试
def fun(num):
aList = []
for i in range(num):
aList.append((i+1) if i < 2 else sum(aList[-2:]))
return aList

print(fun(10))
yueyoum
2014-05-23 10:51:04 +08:00
yueyoum
2014-05-23 10:51:26 +08:00
yueyoum
2014-05-23 10:55:06 +08:00
LZ 你的JS代码 我执行的结果为:

wang[10:53][/tmp]$ time node x.js
165580141

real 0m2.235s
user 0m2.224s
sys 0m0.028s


比 python 慢多了。



JS不熟悉,就不说了。

但对于python,说两点:

1, 别用递归, 你把 40 调大一点试试, 不是速度慢的问题,是直接 栈溢出, 程序崩溃的问题。
2, 你的代码有误,结果不对
chevalier
2014-05-23 10:57:26 +08:00
我想说一句,这三种语言的应用场景都是IO密集型的,单纯比较计算速度有意义吗?
riaqn
2014-05-23 11:03:07 +08:00
感觉是刘翔和姚明比赛跑400米,然后刘翔赢了……
codingpp
2014-05-23 11:03:19 +08:00
@yueyoum

1 这个是测试,是来对比的,我是专门写了递归的程序,下面有不是递归的程序测试,两种测试都表明python是慢的。程序也都运行出结果了,没有栈溢出的情况
2 代码哪里有误?程序运行完成后我都打印出来了结果,结果都是正确的

你的执行python运行了多长时间?
binux
2014-05-23 11:09:31 +08:00
月经,你要测就测你直接的实际应用
函数调用,循环,变量,运算都差异太大你这混着测算什么东西?
codingpp
2014-05-23 11:17:26 +08:00
@chevalier
python也会应用在科学计算上
也会看计算性能的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/113887

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX