簡體   English   中英

Python:for循環耗時太長

[英]Python: for loop taking too long

我正在嘗試編寫一個代碼來解決在線看到的減少分數問題。 對於n和d的小值,我得到了一個答案,但是當試圖求解n和d的大值時,for循環需要很長時間才能得到內存錯誤(在等待代碼運行大約一個小時之后) )。

“通過按大小的升序列出d≤1,000,000的減少的適當分數集......”

有沒有辦法可以在不使用冗長的for循環的情況下檢查n的大值的所有可能分數?

fraction_list = []

for d in range(1000000):
    for n in range(1000000):
        if n<d and n/d ==0 :
            frac = float(n) / float(d)
            #print(frac)
            fraction_list.append(frac)



index_num = (fraction_list.index(float(2.0/7.0)))

sorted(fraction_list, key=float) 
print(fraction_list[index_num])
print("the fraction which is to the left is" + fraction_list[index_num -1])

我想可能有比我在這里提出的方法更有效的方法,但是當你意識到你不需要計算分子和分母在0..1000000范圍內的所有因子時,你至少可以避免雙循環。

你可以只在分母(從1開始,而不是0)開始循環,然后遞增分子(從0開始),直到它超出給定的分數。 那時分子減去一次,所以它代表了一個潛在的候選解決方案。 然后在下一次迭代中 - 當分母為1時,沒有必要再次將分子重置為0,它可以在離開的地方繼續,因為可以確定新分數將小於給定分數:那是你真正獲得時間的地方。

這意味着您可以使用線性方法而不是二次方法:

def get_prev_fraction(num, denom, limit = 1000000):
    bestnum = 0
    bestdenom = 1
    a = 0
    for b in range(1,limit+1):
        while a*denom < b*num:
            a += 1
        a -= 1
        if a*bestdenom > b*bestnum:
            bestnum, bestdenom = a, b
    return bestnum, bestdenom


num, denom = get_prev_fraction(2, 7)

print("the fraction which is to the left of {}/{}={} is {}/{}={}".format(2, 7, 2.0/7, num, denom, num/denom))

這輸出:

在2/7 = 0.2857142857142857左側的分數是285713/99996 = 0.28571414285657143

請注意,該帖提到d≤100萬 ,所以你需要做的range(1000001)以包括限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM