算 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为何慢这么多(慢得太离谱了。。。)
12971 次点击
所在节点    问与答
106 条回复
GordianZ
2014-10-18 16:39:18 +08:00
[Citation needed]
yuelang85
2014-10-18 16:39:23 +08:00
没有代码啥也没法说
liprais
2014-10-18 16:41:20 +08:00
不贴代码就说结果就是耍流氓
caizixian
2014-10-18 16:46:34 +08:00
别告诉我你用了range
loading
2014-10-18 16:46:50 +08:00
java用求和公式, python用 for 一个个加?
MonkLuf
2014-10-18 16:47:21 +08:00
@yuelang85
@liprais 这种代码有啥好说的?既然你要看,那就给你:

python3:

def sum():
i = 0
s = 0
start = time.time()
while i < 1000000000:
i+= 1
s += i
end = time.time()
print("sum: {0}, use time: {1}'s".format(
s,
end-start))
sum()


java:

public class Sum {

public static void main(String[] args) {
long startTime=System.currentTimeMillis(); //获取开始时间
long i = 0, sum = 0;
while (i++ < 1000000000){
sum += i;
}
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.format("sum: %d, use time: %f's", sum,
(endTime - startTime)/1000.0);
}

}

c:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

int main(){
struct timeval start, end;
gettimeofday(&start, NULL);

long long i = 0, sum = 0;
while (i++ < 1000000000){
sum += i;
}
gettimeofday(&end, NULL);

printf("sum: %lld, time used: %f 's",
sum,
end.tv_sec - start.tv_sec + (end.tv_usec - start.tv_usec)/1000000.0);
}
MonkLuf
2014-10-18 16:49:26 +08:00
当然c加上-O3优化之后1.7s解决
FreeBTC123
2014-10-18 16:49:38 +08:00
Python 2.7.5 (default, Mar 9 2014, 22:15:05)
Type "copyright", "credits" or "license" for more information.

IPython 2.2.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.

In [1]: timeit sum(xrange(1, 1000000001))
1 loops, best of 3: 9.26 s per loop

In [2]:
MonkLuf
2014-10-18 16:50:27 +08:00
@loading java用求和公式什么意思?
loading
2014-10-18 16:52:16 +08:00
你前面不给代码,我也只能这样猜!
kyangc
2014-10-18 16:58:13 +08:00
Java和C是有编译器优化在里面的
python编译器不了解,不过看这样子应该是没的……
zts1993
2014-10-18 17:01:57 +08:00
我觉得可能是python3 int 无限精度引起的。。谁来解释一下。
iscraft
2014-10-18 17:02:20 +08:00
php for 结果对不?
----5.0000000006711E+17--------103.5865240097秒----
likexian
2014-10-18 17:16:54 +08:00
python2
sum(xrange(1, 1000000001))
烂笔记本,用了15s
zts1993
2014-10-18 17:18:29 +08:00
@iscraft php得用gmp吧?
MonkLuf
2014-10-18 17:25:26 +08:00
@iscraft 对的,和是500000000500000000
shiny
2014-10-18 17:25:46 +08:00
@iscraft 我这里结果和 python 的一样,PHP 5.5.14,耗时比 python2 少一半多。
shiny
2014-10-18 17:26:43 +08:00
可惜 OS X 下没有 hacklang/hhvm,不知道会是什么样的结果。
ifishman
2014-10-18 17:31:31 +08:00
换了个算法,在树梅派上1/20000秒,这算不算作弊?
MonkLuf
2014-10-18 17:32:58 +08:00
@shiny
@iscraft 不能这么对比,毕竟机器不一样,待我再测测php的,不过同样可以参考一下这篇文章的测试数据,用快排对比java/python/c的IO和计算速度:

http://fantasyorg.blog.163.com/blog/static/109276109201223031127384/

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

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

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

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

© 2021 V2EX