我在使用此代碼時需要一些實際編碼,它需要封閉循環中的所有變量。我在想,如果迭代必須進行的範圍是相同的,那麼必須採用另一種方式,縮進和對所有變量的訪問權限相同。在Python中嵌套循環縮減的替代方案
是否有具有
- 少縮進到這樣的嵌套循環的替代
- 訪問變量以相同的順序在封閉範圍
的代碼:
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
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)
新的調速:
1.60324387493
1.28266455309
這些顯示Lattyware的代碼更好。
問題是直接在列表後面的代碼 - 顯然,列表元素用於markdown中的其他內容之後的縮進。編輯修復。 –