Re: [問題] 排列組合

看板Python作者 (York)時間16年前 (2008/10/26 15:11), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串13/17 (看更多)
好玩的是,非遞迴版調換迴圈順序後也變快幾近一倍: 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

10/27 02:04, , 1F
不太了解@@ 那這時內層迴圈不是較多嗎 怎麼變快了??
10/27 02:04, 1F

10/27 12:22, , 2F
可能是因為 in 'ATCG' 比 in L 耗運算吧,有空再驗證一下
10/27 12:22, 2F

10/27 12:24, , 3F
函數呼叫與迴圈哪個比較耗時呢? (我猜是函數呼叫)
10/27 12:24, 3F

10/27 22:27, , 4F
果然是因為 in 'ATCG' ,它每個迴圈都要重建一個 list ,
10/27 22:27, 4F

10/27 22:28, , 5F
這很花時間,解法可先 I = list('ATCG') ,然後再用 in I
10/27 22:28, 5F
文章代碼(AID): #1911W9lw (Python)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 13 之 17 篇):
文章代碼(AID): #1911W9lw (Python)