算 1 到 10 亿的所有自然数的和,c 用时 4.4's, java 用时 3.8's,python 用时 302.9's,已吓尿,求解释

2014-10-18 16:37:36 +08:00
 MonkLuf
算1到10亿的所有自然数的和,c用时4.4's, java用时3.8's,python用时302.9's。

吓尿!!!

java居然这么快,居然比c都快!!python居然慢了将近100倍也太夸张了吧!!这个速度突然毁掉了我的世界观。。。。。

求懂java的人带详细理由的告诉我为什么java会这么快,python为何慢这么多(慢得太离谱了。。。)
12972 次点击
所在节点    问与答
106 条回复
NathanInMac
2014-10-19 01:37:04 +08:00
go不到500ms。。
Sharuru
2014-10-19 02:11:03 +08:00
从看到这贴就好奇,楼主好坏是在一台电脑上用不同的语言做了测试,得出消耗时间不同的结论。
但是其他诸位仅做了一种语言的测试。
同样的代码不同电脑跑完全是不一样的计算结果。
辣鸡的代码在流弊的电脑上可以跑1s,高效的代码在辣鸡代码上却要跑10s…
一本正经的不明所以。
MonkLuf
2014-10-19 02:24:25 +08:00
@Shared
@iam36
@takato
@icedx
@ant_sz
@davidli
嗯,此帖并不是说为了解决某个问题而讨论各种语言的效率,也不是为了证明语言之间的优劣,而只是就单纯的运算速度而言给这几种语言一个直观的认识。

以前只知道python运算效率低,没想到这么低,低个几百倍。。。java效率低,但是看起来好像没低多少。。。
Shared
2014-10-19 02:32:29 +08:00
@MonkLuf 效率取决于场景(context)
konakona
2014-10-19 03:08:42 +08:00
我本来想打开xcode来一段swift的……可是xcode死机了……
icedx
2014-10-19 03:17:05 +08:00
@MonkLuf 但是…我也觉得这个低Python 的不科学
msg7086
2014-10-19 05:37:24 +08:00
@pH 既然你诚心诚意地问了……下略

https://gist.github.com/msg7086/b5de7cb128d8ef109808
msg7086
2014-10-19 06:21:05 +08:00
楼上的代码本来是用 AVX Intrinsics 写的,但是在不启用优化的情况下编译器会自作主张改写汇编语句结构。所以这里老老实实重写成了 inline asm 代码。要看 Intrinsics 版本的,可以去看 Gist 的提交历史。
wwqgtxx
2014-10-19 07:06:51 +08:00
想知道js的运行速度
在chrome/ie/firefox下试试?
efen
2014-10-19 08:16:50 +08:00
@MonkLuf 其实主要的点是,和一般的语言不同很反直觉的是,Python的操作中,加减恰恰是最慢的,而带来的好处嘛,数值计算上实在是方便得多
Sharuru
2014-10-19 09:57:54 +08:00
不过人类最强计算器Python算大数什么的倒是非常惬意。
hitsmaxft
2014-10-19 09:58:21 +08:00
不能这么比的, c 跟 java 有编译时优化, python 就只能拼人肉优化了..
mille
2014-10-19 11:16:19 +08:00
sum: 500000000500000000, time used: 3.141718 's

还是我oc拯救世界😄
Actrace
2014-10-19 11:16:55 +08:00
Actrace
2014-10-19 11:17:09 +08:00
Actrace
2014-10-19 11:18:33 +08:00
Actrace
2014-10-19 11:18:52 +08:00
终于懂贴代码了~
gihnius
2014-10-19 11:46:37 +08:00
common lisp 直接算:

```
CL-USER> (time (loop for i from 1 to 1000000000 sum i))
Evaluation took:
2.877 seconds of real time
2.888336 seconds of total run time (2.878674 user, 0.009662 system)
100.38% CPU
6,603,209,056 processor cycles
32,912 bytes consed

500000000500000000


CL-USER> (time (let ((sum 0)) (dotimes (x 1000000001) (incf sum x)) sum))
Evaluation took:
2.883 seconds of real time
2.894640 seconds of total run time (2.884340 user, 0.010300 system)
100.42% CPU
6,616,544,771 processor cycles
33,296 bytes consed

500000000500000000

```
ptyfork
2014-10-19 12:55:00 +08:00
$ ikarus

Ikarus Scheme version 0.0.4-rc1+, 64-bit (revision 1870, build 2014-10-07)
Copyright (c) 2006-2009 Abdulaziz Ghuloum

> (time
(let lp ((i 0) (sum 0))
(if (<= i 1000000000)
(lp (+ 1 i) (+ i sum))
sum)))
running stats for (let lp ((i 0) (sum 0)) (if (<= i 1000000000) (lp (+ 1 i) (+ i sum)) sum)):
no collections
3148 ms elapsed cpu time, including 0 ms collecting
3155 ms elapsed real time, including 0 ms collecting
0 bytes allocated
500000000500000000
gihnius
2014-10-19 13:01:57 +08:00
@gihnius 稍微优化一下:

```
CL-USER> (time (let ((sum 0)) (declare (type fixnum sum)) (dotimes (x 1000000001) (incf sum x)) sum))
Evaluation took:
0.606 seconds of real time
0.609144 seconds of total run time (0.607192 user, 0.001952 system)
100.50% CPU
1,392,562,529 processor cycles
0 bytes consed

500000000500000000

```

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

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

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

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

© 2021 V2EX