找回密码
 注册
Simdroid-非首页
查看: 161|回复: 8

[欧拉习题] Total@与Plus@@效率

[复制链接]
发表于 2011-1-25 23:08:03 | 显示全部楼层 |阅读模式 来自 四川绵阳
今天看到欧拉习题的第12题,随手将Plus@@改为了Total@,发现效率提高了几十倍,原理上来说两个命令应该差不多才对啊


Module[{n, tr := Plus @@ Range[#] &}, n = 1;
  While[Length[Divisors@tr[n]] <= 500, n++]; tr[n]] // Timing
发表于 2011-1-26 12:28:25 | 显示全部楼层 来自 浙江杭州
Simdroid开发平台
什么叫原理上差不多啊,,,Total是求列表元素的和,
Plus是求项的和。
回复 不支持

使用道具 举报

发表于 2011-1-26 13:44:35 | 显示全部楼层 来自 江苏徐州
本帖最后由 guocong89 于 2011-1-26 13:58 编辑

2# HyperGroups
此言差矣
单就这个例子来说
Total[ list ] is equivalent to Apply[Plus,list].
回复 不支持

使用道具 举报

发表于 2011-1-26 13:56:36 | 显示全部楼层 来自 江苏徐州
1# wudai04
  1. Total@Prime@Range@1000000 // Timing
  2. Plus @@ Prime@Range@1000000 // Timing

  3. {4.218, 7472966967499}
  4. {4.157, 7472966967499}
复制代码



我觉得问题出在循环上
回复 不支持

使用道具 举报

发表于 2011-1-26 13:59:13 | 显示全部楼层 来自 江苏徐州
3# guocong89
发现论坛一个bug,
  1. [list]
复制代码
无法输入
    会变成回车
回复 不支持

使用道具 举报

发表于 2011-1-26 14:09:51 | 显示全部楼层 来自 江苏徐州
本帖最后由 guocong89 于 2011-1-26 15:14 编辑

1# wudai04
之前没有看 jimogsh的解答,我这里稍微做了点优化
  1. Module[{n}, n = 1;
  2.   While[Length[Divisors@(n (n + 1)/2)] <= 500, n++];
  3.   n (n + 1)/2] // Timing

  4. {0.36, 76576500}
复制代码
  1. Module[{n, sum = 0}, n = 1; sum = 1;
  2.   While[DivisorSigma[0, sum] <= 500, n++; sum += n]; sum] // Timing

  3. {0.172, 76576500}
复制代码
回复 不支持

使用道具 举报

发表于 2011-1-27 12:02:29 | 显示全部楼层 来自 浙江杭州
本帖最后由 HyperGroups 于 2011-1-27 14:08 编辑

3# guocong89

恩,我没有看过Euler习题,我只是Trace了一下,发现一个有趣的东西,Plus的情况会多出一个1+2+3...之类的。
而楼主的意思应该是说只是用了Plus这两个命令,就有如此显著的差别了。

而Total的确要比Plus要快一些,
In[3]:= Total[Range[10000000]] // Timing
Out[3]= {2.169, 50000005000000}
In[4]:= Plus @@ Range[10000000] // Timing
Out[4]= {2.199, 50000005000000}

另外我那是提问,我是说什么叫原理差不多,所有的函数原理都差不多:写一段代码,让cpu计算。。。。。。不知道是什么层面的的。
primes就是那些素数。
In[30]:= [email=Total@primes]Total@primes[/email]; // Timing
Out[30]= {0.031, Null}
In[31]:= Plus @@ primes; // Timing
Out[31]= {0.047, Null}
回复 不支持

使用道具 举报

发表于 2011-1-27 14:07:23 | 显示全部楼层 来自 浙江杭州
Module[{n, tr := Apply[Plus, Range[#]] &}, n = 1;
  While[Length[Divisors[tr[n]]] <= 319, n++]; tr[n]] // Timing
在我的电脑上
从320开始突然要增加更多的时间了,从0.几秒变成了3.5+秒,然后从479结束480开始突然变成了15秒+
579开始变成22+,
还是非常有趣的。
回复 不支持

使用道具 举报

 楼主| 发表于 2011-2-15 19:53:39 | 显示全部楼层 来自 辽宁沈阳
感谢几位的回复,HyperGroups 的情况我测试了一下也有的,但是还是搞不懂为啥,guocong89 的优化不错,谢谢啦
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-17 00:30 , Processed in 0.031982 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表