作者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
1F:推 Arton0306:不太了解@@ 那这时内层回圈不是较多吗 怎麽变快了?? 10/27 02:04
2F:→ ykjiang:可能是因为 in 'ATCG' 比 in L 耗运算吧,有空再验证一下 10/27 12:22
3F:→ rexrainbow:函数呼叫与回圈哪个比较耗时呢? (我猜是函数呼叫) 10/27 12:24
4F:→ ykjiang:果然是因为 in 'ATCG' ,它每个回圈都要重建一个 list , 10/27 22:27
5F:→ ykjiang:这很花时间,解法可先 I = list('ATCG') ,然後再用 in I 10/27 22:28