刚才测试了一下 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慢,但是这个差的有点多啊
58461 次点击
所在节点    Python
105 条回复
hooluupog
2014-05-23 18:18:29 +08:00
@codingpp 你上面写的那个递归就不是尾递归的。
至于循环测试为什么node快,是因为v8快,做了JIT编译。同样,我分别在python和pypy(支持JIT编译)上去执行那个测试,结果如下:
$ time ./pypy 1.py
1249999975000001
real 0m3.660s
user 0m0.015s
sys 0m0.078s

$ time ./node 1.js
1249999975000001

real 0m0.328s
user 0m0.046s
sys 0m0.046s

看到没,几乎是一样的速度。
hooluupog
2014-05-23 18:22:33 +08:00
上面打错了,纠正:分别在node和pypy上测试。
codingpp
2014-05-23 18:38:56 +08:00
@hooluupog
表述的不正确
我不认为快是由于JIT快的,而是node和pypy在即时编译的时候对尾递归做了优化
hooluupog
2014-05-23 19:49:10 +08:00
@codingpp 我大意了,上面pypy还是比node慢,不过已经没有70倍那么多了。我说的JIT快是指你后面给的那个循环测试。
node和pypy估计现在都不支持尾递归优化(https://code.google.com/p/v8/issues/detail?id=457, ES6有提到未来打算支持,pypy应该还是不支持的)。
ruoyu0088
2014-05-23 20:09:39 +08:00
node.js和PHP支持长整数吗,那个while(i < 50000000)循环的结果是多少?
vibbow
2014-05-24 01:28:04 +08:00
@ruoyu0088 PHP支持GMP,所以特大整数在PHP这里没问题。
davidli
2014-05-24 03:09:06 +08:00
@codingpp
其实 Matlab 这些科学计算的东西才是慢得吓人。
notcome
2014-05-24 08:19:13 +08:00
@codingpp 一般逛 V2EX 的人会放着 IE 9/10/11 不升级吗……
codingpp
2014-05-24 10:45:29 +08:00
@notcome
原来逛V2EX都这么高贵冷艳啊
反正我ie几乎从来不打开,在公司用win7那就是ie8咯,在家里win8.1刚才看了一眼,那就是ie11咯
yakczh
2014-05-24 11:17:42 +08:00
我认为做个字符串解析或者json解析的比较更有实际意思 这个纯i++的操作完全看编译器的优化了
notcome
2014-05-24 13:30:37 +08:00
@codingpp 公司当我没说。不过不升级浏览器和继续使用 XP 一样恶劣。
codingpp
2014-05-24 14:44:02 +08:00
@notcome
哎 连不升级一个垃圾浏览器都被说成恶劣,v2ex这个地方高贵冷艳的奇葩真是多啊
notcome
2014-05-24 16:33:54 +08:00
@codingpp 哦,对不起,没反应过来。哈哈没有小红点催你升级=_=
wuhx
2014-05-24 21:02:51 +08:00
@yueyoum 要展示我大erlang的优雅应该用这个经典栗子

#!/usr/bin/env escript

fib(0) -> 0;
fib(1) -> 1;
fib(N) -> fib(N-1) + fib(N-2).

main(_) ->
io:format("~w~n",[fib(40)]).
lm902
2014-05-25 10:28:05 +08:00
Python 3.3.0+ (win8app, Dec 27 2012, 21:34:06) [MSC v.1700 32 bit (Unknown)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> def fibo(n):
... return fibo(n - 1) + fibo(n - 2) if n > 1 else 1
>>> print(datetime.datetime.now());print(fibo(40));print(datetime.datetime.now())
2014-05-24 22:19:58.152036
165580141
2014-05-24 22:25:31.959224
>>>


Python花了5分33.796812秒好吧,哪有你说的那么快
lm902
2014-05-25 10:38:45 +08:00
http://pic.aojiao.org/uploads/2014/05/%E6%8D%95%E8%8E%B79.PNG

IE浏览器倒是比较快,控制台略坑爹懒得一行一行复制,直接上图
10iii
2014-05-25 10:44:25 +08:00
序言:LZ你这飞波算法明显有问题,fib(2)应该等于1啊喂.

首先:LZ的算法不是尾递归.尾递归要返回自身的调用,LZ这个经典算法返回的是个"+"调用.所以讨论不到尾递归优化.

其次:我觉得这种比较是有意义的,对相同的简单问题,使用相同的算法来解答,更容易分析速度之间的差异是由什么原因造成的,然后采取特定的策略.
大家有没有发现LZ提出了两个不同的测试,但讨论都集中在第一题递归上.原因就是第二个测试足够简单,就是循环,累加.多费口舌讨论显得愚蠢.于是很容易达成结论.那些要测试综合应用速度的同学们都还沒考虑到综合运用中牵扯的因素更多,比较结果会引发更多扯皮的讨论,最终是公婆都有理,谁也不信谁.

好几位同学从LZ使用原始的飞波算法这点来质疑LZ的算法能力,这种讨论方式试图以人废言,不好.

再来LZ这个讨论其实不能以语言来贴标签,应该以语言实现来贴标签.
wangxinyu
2014-05-25 22:44:42 +08:00
Python慢是公认的
bigtan
2014-05-25 22:53:59 +08:00
def fib(n):
x=[0,1]
for i in range(n):
x=[x[1],x[0]+x[1]]
return x[1]

%%timeit
fib(40)

10000 loops, best of 3: 19.9 µs per loop
装上scipy with MKL,单机矩阵运算跑得过MATLAB好么。你看我上面运算的单位,那是19.9微秒。
bigtan
2014-05-25 22:57:05 +08:00
%%time
...: fib(100000)
...:
Wall time: 307 ms
其实还是代码写得不给力

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

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

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

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

© 2021 V2EX