簡體   English   中英

將python中的遞歸深度增加到100000

[英]increasing recursion depth in python to 100000

python有一個默認的最大遞歸深度,我可以增加它:

import sys

sys.setrecursionlimit(100000)

我正在使用歸並排序,當我嘗試對80000個元素的列表進行排序時,python“意外退出”。 這不是我迭代實現合並排序的問題,但是我對遞歸排序感興趣。

我正在使用Mac OSX 8GB內存。 有沒有辦法讓它在我的機器上工作,還是可以在更好的機器上工作?

import sys

sys.setrecursionlimit(100000) # python has a recurison depth of < 1000~. so for the purpose of this assignment I'm increasing it

counter = 0


def merge_sort(lst):
    global counter
    if len(lst) <= 1:
        counter += 1   # increment counter when we divide array in two
        return lst
    mid = len(lst) // 2
    left = merge_sort(lst[:mid])
    right = merge_sort(lst[mid:])
    return merge(left, right)


def merge(left, right):
    global counter
    if not left:
        counter += 1   # increment counter when not left (not left - is also comparison)
        return right
    if not right:
        counter += 1   # the same as above for right
        return left
    if left[0] < right[0]:
        counter += 1   # and the final one increment
        return [left[0]] + merge(left[1:], right)
    return [right[0]] + merge(left, right[1:])


lines = [line.rstrip('\n') for line in open('words.txt')]

當我在40000上嘗試上述操作時,它可以對列表進行排序:

print(merge_sort(lines[0:40000]))

但是在50000或更高級別上則沒有。 .txt文件中的單詞總數約為80000

我收到的消息:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

問題來自您的merge(left, right)實現,該實現在O(n)中是遞歸的。 您在每個遞歸步驟中將兩個排序的列表按一個元素合並。 遞歸合並的想法在優化尾遞歸的語言中可能是有意義的, 但在python中不是這種情況

通常,合並是迭代的,因為其復雜度始終至少是要合並的元素數。

def merge(left, right):
    merged = []
    i = 0
    j = 0
    while i < len(left) and j < len(right) :
        if left[i] < right[j]:
            merged.append(left[i])
            i+=1
        else:
            merged.append(right[j])
            j+=1
    merged += left[i:]
    merged += right[j:]
    return merged

暫無
暫無

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

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