Ase*_*sal 0 python indentation python-2.7
我使用这个代码与一些实际编码,需要封闭循环中的所有变量.我在想,如果必须进行迭代的范围是相同的,那么必须有另一种方式,减少压缩和对所有变量的相同访问.
有没有这种嵌套循环的替代品
代码:
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)
Run Code Online (Sandbox Code Playgroud)
时间结果
#My way
0.259999990463
#Lattyware's suggested way
0.310000181198
Run Code Online (Sandbox Code Playgroud)
EDIT2:
在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)
Run Code Online (Sandbox Code Playgroud)
新时间:
1.60324387493
1.28266455309
Run Code Online (Sandbox Code Playgroud)
这些表明Lattyware的代码更好.
假设(如在你的例子中)循环都独立于父循环,你想要itertools.product().
import itertools
for i, j, k, l, m, n, o, p, q in itertools.product(xrange(1, 5), repeat=9):
...
Run Code Online (Sandbox Code Playgroud)
在这里,我使用repeat关键字参数作为简写,在您的示例中,迭代是完全相同的,但如果您的迭代不完全相同,您也可以将它传递给多个迭代.
它也比许多嵌套循环更有效.请注意,您的问题可能有更好的解决方案 - 因为使用如此多的嵌套循环进行迭代可能会进行大量迭代,因此非常慢.
或者,如果您的循环依赖于它们的父循环等(并且因此product()不适合),您可以定义函数以采取一些重度嵌套并将其抽象出来.
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):
inner_loops(i, j, k, l, m)
def inner_loops(i, j, k, l, m):
for n in xrange(1,5):
for o in xrange(1,5):
for p in xrange(1,5):
for q in xrange(1,5):
pass
Run Code Online (Sandbox Code Playgroud)
这将表现得比product()并且可读性差,但可能是必要的,具体取决于具体情况.当然,您可以根据需要使用尽可能多的功能来根据需要减少嵌套.
最后,我假设您使用范围作为一个简单示例,但如果您计划使用索引循环数据结构,请不要!它难以阅读,缺乏灵活性和缓慢.直接遍历数据结构本身 - 这些方法可以正常工作(事实上,更好).
| 归档时间: |
|
| 查看次数: |
1176 次 |
| 最近记录: |