算 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为何慢这么多(慢得太离谱了。。。)
12969 次点击
所在节点    问与答
106 条回复
MonkLuf
2014-10-18 17:34:18 +08:00
@ifishman 用个公式会快多了好吧,这个测试本来就是用来判断这几个语言的计算速度的,你又淘气了。。。。
RIcter
2014-10-18 17:36:30 +08:00
python本来就不是拼速度的,何必呢。
不如手算?
shiny
2014-10-18 17:38:02 +08:00
@MonkLuf 当然是在自己机器上跑 python 再跑 php,然后对比时间。
regmach
2014-10-18 17:40:48 +08:00
float 5.0000000006711E+17
65.392sec
LINAICAI
2014-10-18 17:43:03 +08:00
这个。。。为什么我感觉没必要争论,py是解析语言,c和java经过编译器优化。
hjc4869
2014-10-18 17:47:22 +08:00
你试试用c语言写个高精度加法的再去跟python比。
sneezry
2014-10-18 17:51:32 +08:00
好不好js现在都比py快了……
sneezry
2014-10-18 17:51:57 +08:00
搞不好,打错了
robbielj
2014-10-18 17:54:46 +08:00
我觉得为什么要有numpy,为什么要有cython很好地解释了你这个问题
yuelang85
2014-10-18 17:55:25 +08:00
前面好多人都贴了sum,sum应该是c写的吧?

我能想到的几种方式:

https://gist.github.com/0e3f2b106a1ec41da2c9.git
yuelang85
2014-10-18 17:55:42 +08:00
barbery
2014-10-18 17:57:23 +08:00
@sneezry 按我之前的经验,js肯定比py快啊
pimin
2014-10-18 18:06:52 +08:00
c用时4.4's肯定是编译时没开优化,我电脑上跑是0.86s
ysjdx
2014-10-18 18:07:46 +08:00
试试pypy 会快很多
ZavierXu
2014-10-18 18:11:33 +08:00
写代码从来就一个要求, 能跑就行, 追求速度不如想想如何不出错
ysjdx
2014-10-18 18:12:07 +08:00
@ysjdx

sum(xrange(1000000001))

在我的电脑上面,pypy用时

1.27434396744
ChiangDi
2014-10-18 18:14:55 +08:00
@sneezry 快多了,不是一个级别的。
anheiyouxia
2014-10-18 18:16:51 +08:00
楼主,你很幸运,以前我看过一篇也是python浮点运算慢的文章,然后现在我又找出来给你了:
http://bbs.byr.cn/#!article/Focus/69820


=============华丽的分割线=============
举一个例子。对于整数加法,C语言很简单,只要一个机器指令ADD就可以了,最多不过再加一些内存读写。

但是,对于Python来说,a+b这样的简单二元运算,可就真的很麻烦了。Python是动态语言,变量只是对象的引用,变量a和b本身都没有类型,而它们的值有类型。所以,在相“加”之前,必须先判断类型。

1. 判断a是否为整数,否则跳到第9步
2. 判断b是否为整数,否则跳到第9步
3. 将a指向的对象中的整数值读出来
4. 将b指向的对象中的整数值读出来
5. 进行整数相加
6. 生成一个新整数对象
7. 将运算结果存进去
8. 返回这个对象,完成!
9. 判断a是否为字符串,否则跳到第13步
10. 判断b是否为字符串,否则跳到第13步
11. 进行字符串串接操作,生成一个新字符串对象
12. 返回这个对象,完成!
13. 从a的字典里取出__add__方法
14. 调用这个方法,将a和b作为参数传入
15. 返回上述方法的返回值。

这还只是简化版的,实际中还要考虑溢出问题等。

可想而知,如果对于每一次加法运算,C语言只需要一个机器指令,而Python要做这么多操作,Python显然要比C慢得太多。再加上官方的CPython是一个解释器,还要加上每次读指令、指令译码的代价,就更慢了。
=============华丽的分割线=============
cctvsmg
2014-10-18 18:21:13 +08:00
@ysjdx
root@ubuntu:~# pypy test.py
sum_raw: 500000000500000000, use time: 1.45206093788's
sum_1: 500000000500000000, use time: 1.4495549202's
sum_2: 500000000500000000, use time: 1.45537519455's
sum_3: 500000000500000000, use time: 1.45463609695's
pH
2014-10-18 18:51:00 +08:00
我一直期待有人来汇编呢

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

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

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

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

© 2021 V2EX