作者ykjiang (York)
看板Python
標題Re: [問題] 排列組合
時間Sun Oct 26 15:11:02 2008
好玩的是,非遞迴版調換迴圈順序後也變快幾近一倍:
def gen1_2(n):
L = ['']
for i in xrange(n):
L = [j+k for j in 'ATCG' for k in L]
return L
所以現在非遞迴版比遞迴版快一倍 :)
※ 引述《ykjiang (York)》之銘言:
: 其實遞迴版並不會比較慢,只要稍做調整:
: def gen(n):
: if n == 0:
: return ['']
: else:
: return [x+y for x in gen(n-1) for y in 'ATCG']
: 改變迴圈的順序,這是很基本的最佳化作法...
: ※ 引述《mantour (朱子)》之銘言:
: : 測n=10時
: : def gen1(n):
: : list=['']
: : for i in range(n):
: : tmp=[j+k for j in list for k in 'ATCG']
: : list=tmp
: : return list
: : 3.949s
: : 下面的版本在我的電腦上測n=10為17.545s
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.70.98.179
推 Arton0306:不太了解@@ 那這時內層迴圈不是較多嗎 怎麼變快了?? 10/27 02:04
→ ykjiang:可能是因為 in 'ATCG' 比 in L 耗運算吧,有空再驗證一下 10/27 12:22
→ rexrainbow:函數呼叫與迴圈哪個比較耗時呢? (我猜是函數呼叫) 10/27 12:24
→ ykjiang:果然是因為 in 'ATCG' ,它每個迴圈都要重建一個 list , 10/27 22:27
→ ykjiang:這很花時間,解法可先 I = list('ATCG') ,然後再用 in I 10/27 22:28