作者apua (Apua)
看板Python
标题Re: [讨论] 提昇Python执行的速度
时间Tue Apr 13 22:58:51 2010
: for n in range(counts):
: input_temp=input()
: temp=range(1,input_temp+1)
: count=0
: for i in temp[4::5]:
: count+=logfive(i)
: print count
您使用了range(n)来建立一组list,同时又使用了slice切片处理
必须说,当n极大时(python处理无穷长整数可是出了名的)
你的temp会因为制造range(n)这个怪物而极慢
若使用xrange(n)来避免制造怪物,则您就不能用切片处理了。
(其实xrange也不能制造怪物,因为xrange的引数不能是长整数)
除此之外,当temp极大时,使用for回圈似乎也会特别慢(据说)
试图用特别的手法来加速是不错,
但既然都用python了,建议用值觉得方法来解决当前问题就好。
--
使用python2.6
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.104.29.51
1F:→ sbrhsieh:那个 slice 操作是不必要的。他想要 iterate 5 的倍数, 04/13 23:16
2F:→ sbrhsieh:可以使用 xrange(指定 step)。 04/13 23:18
※ 编辑: apua 来自: 59.104.29.51 (04/14 00:28)
3F:→ sbrhsieh:不晓得你建议的直觉做法是指? 04/14 00:48
就是您的作法XD 我觉得那样清楚又直觉
4F:→ sbrhsieh:是针对原 po 想要使用 slice 来略过前几个数? 04/14 00:49
5F:→ sbrhsieh:如果考虑倒要应付极大的数,他这演算法本身也需要大改进 04/14 00:59
因为他的题目一开始有出现99999999!所以应该是要考虑没错
不用range/xrange的话,直接用您前面写的tail_zeros(),因为是单纯的计算,
所以不必担心长整数的影响,轻松多了。
6F:推 hsnu114444:那如果改用range(0,temp_input+1,5)呢? 04/14 01:28
7F:→ DigiPrince:旧的方法细部再怎麽改还是 O(N)... 04/14 05:43
8F:→ DigiPrince:如果你真的需要速度,就该好好想想 s 大的演算法。 04/14 05:44
9F:→ DigiPrince:s 大的演算法是 O(log(n)) 的,大数 O(N) 根本没胜算 04/14 05:45
是呀
※ 编辑: apua 来自: 140.109.17.44 (04/14 10:03)