作者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)