我将此代码与一些实际编码一起使用,这些编码需要封闭循环中的所有变量。我在想,如果必须进行迭代的范围相同,则必须有另一种缩进更少且对所有变量具有相同访问权限的方法。
有没有替代这种嵌套循环的方法
- 缩进更少
- 在封闭范围内以相同的顺序访问变量
编码:
import itertools
import time
#My Way
s = time.time()
sums_pyramid = [0] * 36
for i in xrange(1,5):
for j in xrange(1,5):
for k in xrange(1,5):
for l in xrange(1,5):
for m in xrange(1,5):
for n in xrange(1,5):
for o in xrange(1,5):
for p in xrange(1,5):
for q in xrange(1,5):
sums_pyramid[i+j+k+l+m+n+o+p+q - 1] += 1
print (time.time() - s)
#Lattyware's suggested way
s = time.time()
sums_pyramid = [0] * 36
for i,j,k,l,m,n,o,p,q in itertools.product(xrange(1,5), repeat = 9):
sums_pyramid[i+j+k+l+m+n+o+p+q - 1] += 1
print (time.time() - s)
计时结果
#My way
0.259999990463
#Lattyware's suggested way
0.310000181198
编辑2:
在 Lattyware 建议time
我应该使用timeit
模块而不是使用模块之后,我得到了这些结果
新代码:
import itertools
def p():
#My Way
sums_pyramid = [0] * 36
for i in xrange(1,5):
for j in xrange(1,5):
for k in xrange(1,5):
for l in xrange(1,5):
for m in xrange(1,5):
for n in xrange(1,5):
for o in xrange(1,5):
for p in xrange(1,5):
for q in xrange(1,5):
sums_pyramid[i+j+k+l+m+n+o+p+q - 1] += 1
def q():
#Lattyware's suggested way
sums_pyramid = [0] * 36
for i,j,k,l,m,n,o,p,q in itertools.product(xrange(1,5), repeat = 9):
sums_pyramid[i+j+k+l+m+n+o+p+q - 1] += 1
if __name__ == '__main__':
times = 10
from timeit import Timer
print Timer(p, 'gc.enable()').timeit(number = times)
print Timer(q, 'gc.enable()').timeit(number = times)
新时间:
1.60324387493
1.28266455309
这些表明 Lattyware 的代码更好。