python循环for不从零开始_Python-多处理-巨大的for循环
下午好,
我對Python還是很陌生,我必須解決一個需要嘗試數十億個假設的問題...更具體地說,我需要迭代440個元素的列表,但我需要這樣做8次...(是的,我知道OS迭代的次數完全是瘋狂的。
我的機器相當不錯,所以我想使用多處理python功能來加快速度。
您是否知道任何簡單的解決方案可以從我的機器的處理能力中獲利?
輸入:
配對對:
for ind1 in range(16,37):
for ind2 in range(16,37):
ListPairsAux = []
ListPairsAux.append(ind1)
ListPairsAux.append(ind2)
ListPairs.append(ListPairsAux)
為了簡化問題,您可以假設len(list1 [i])和len(list2 [i])都是整數,并且都等于198。(在實際問題中,我們實際上有21個不同的整數,但是都以相同的順序排列-這意味著它們不會超出198。
for循環如下:
for first in ListPairs:
print(str(first))
for second in ListPairs:
for third in ListPairs:
for fourth in ListPairs:
for fifth in ListPairs:
for sixth in ListPairs:
for seventh in ListPairs:
sumA = first[0] + second[0] + third[0] + fourth[0] + fifth[0] + sixth[0] + seventh[0]
sumB = first[1] + second[1] + third[1] + fourth[1] + fifth[1] + sixth[1] + seventh[1]
for i in range(len(list1)):
if sumA == len(list1[i]) and sumB == len(list2[i]):
List7 = []
List7 = [first, second, third, fourth, fifth, sixth, seventh]
ListsOut[i].append(List7)
for eighth in ListPairs:
sumA = first[0] + second[0] + third[0] + fourth[0] + fifth[0] + sixth[0] + seventh[0] + eighth[0]
sumB = first[1] + second[1] + third[1] + fourth[1] + fifth[1] + sixth[1] + seventh[1] + eighth[1]
for i in range(len(list1)):
if sumA == len(list1[i]) and sumB == len(list2[i]):
List8 = []
List8 = [first, second, third, fourth, fifth, sixth, seventh, eighth]
ListsOut[i].append(List8)
非常感謝!
解決方案
您發布的解決方案可能永遠不會完成,因為它將需要經歷超過10 ^ 21個元素的組合。與其使用多重處理,不如使用更快的算法。
使用您在問題中使用的list1,list2和lists_out,我們正在尋找組合16和36之間的整數的方法,以使它們求和成為list1和list2中序列的長度。組合應為[16,36]范圍內的7或8個整數。
import itertools
def so43965562(list1, list2, lists_out, lower=16, upper=36):
assert len(list1) == len(list2) == len(lists_out)
for n in (7, 8):
for i in range(len(list1)):
# Find all combinations of n numbers in [lower, upper]
# that sum to len(list1[i])
combs1 = combinations_summing_to(lower, upper, n, len(list1[i]))
# Find all combinations of n numbers in [lower, upper]
# that sum to len(list2[i])
combs2 = combinations_summing_to(lower, upper, n, len(list2[i]))
for t1, t2 in itertools.product(combs1, combs2):
result = [(v1, v2) for v1, v2 in zip(t1, t2)]
lists_out[i].append(result)
以下函數寫s為和n之間的整數之l和u。
def combinations_summing_to(l, u, n, s, suffix=()):
"""In which ways can s be written as the sum of n integers in [l, u]?
>>> # Write 2 as a sum of 4 integers between 0 and 5.
>>> print(list(combinations_summing_to(0, 5, 4, 2)))
[(0, 0, 0, 2), (0, 0, 1, 1)]
>>> # Write 5 as a sum of 3 integers between 0 and 5.
>>> print(list(combinations_summing_to(0, 5, 3, 5)))
[(0, 0, 5), (0, 1, 4), (0, 2, 3), (1, 1, 3), (1, 2, 2)]
>>> # Write 12 as a sum of 3 integers between 0 and 5.
>>> print(list(combinations_summing_to(0, 5, 3, 12)))
[(2, 5, 5), (3, 4, 5), (4, 4, 4)]
>>> # Write 34 as a sum of 2 integers between 16 and 36.
>>> print(list(combinations_summing_to(16, 36, 2, 34)))
[(16, 18), (17, 17)]
"""
if n == 0:
return (suffix,) if s == 0 else ()
elif n == 1:
return ((s,) + suffix,) if l <= s <= u else ()
else:
return itertools.chain.from_iterable(
# Combinations summing to s where the last element is k
combinations_summing_to(l, k, n - 1, s - k, (k,) + suffix)
for k in range(u, l-1, -1)
# Early bailout if you can't make s with all elements <= k
if l * n <= s <= k * n)
您可以按以下方式運行解決方案:
lists_out = [[]]
so43965562(list1=[[0]*(7*16+1)], list2=[[0]*(7*16+2)], lists_out=lists_out)
for result in lists_out[0]:
print(result)
# Outputs the following two combinations:
# [(16, 16), (16, 16), (16, 16), (16, 16), (16, 16), (16, 16), (17, 18)]
# [(16, 16), (16, 16), (16, 16), (16, 16), (16, 16), (16, 17), (17, 17)]
lists_out = [[]]
n = 133
so43965562(list1=[[0]*n], list2=[[0]*n], lists_out=lists_out)
print(len(lists_out[0]))
# Outputs 1795769, takes about 2.5 seconds to run.
請注意,輸出大小呈指數增長,當n = 7 * 16 = 112時從零開始,因此當您編寫問題時,當n = 198時,計算所有組合仍將花費很長時間。
總結
以上是生活随笔為你收集整理的python循环for不从零开始_Python-多处理-巨大的for循环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 盘点电视剧中被玷污的女角色 你最无法忍
- 下一篇: xml mysql 模糊查询_mybat