Python分段错误?

13

我运行代码时出现了 Segmentation Fault: 11 错误,但我不知道为什么。

在深入解释之前,这是我的代码:

import numpy.random as nprnd
import heapq
import sys

sys.setrecursionlimit(10**6)


def rlist(size, limit_low, limit_high):
    for _ in xrange(size): 
        yield nprnd.randint(limit_low, limit_high)

def iterator_mergesort(iterator, size):
    return heapq.merge(
         iterator_mergesort(
           (iterator.__next__ for _ in xrange(size/2)), size/2),
         iterator_mergesort(
            iterator, size - (size/2))
       )

def test():
    size = 10**3
    randomiterator = rlist(size, 0, size)
    sortediterator = iterator_mergesort(randomiterator, size)
    assert sortediterator == sorted(randomiterator)

if __name__ == '__main__':
    test()

基本上,它只是一个适用于迭代器和生成器表达式的归并排序,而不是适用于列表,以便在任何一时刻最小化内存占用。它没什么特别之处,并且使用了内置方法heapq.merge()来合并迭代器,所以当所有东西都崩溃时,我感到非常惊讶。

快速运行代码会出现Segmentation Fault: 11的错误窗口,告诉我Python已经崩溃了。我不知道该看哪里或者如何调试这个问题,所以任何帮助将不胜感激。


通常情况下,在Python中出现段错误的原因要么是内存不足,要么是你使用的C模块中存在错误。这个问题可能对你有所帮助:https://dev59.com/PWkw5IYBdhLWcg3wPIJ7 - rnorris
哦,我现在感觉很蠢,我忘记在归并排序中加入基本情况了,所以增加递归限制会破坏一切。 - reem
3
如果你找到了问题的解决方案,你应该写一篇简短的答案并将其接受,而不是编辑标题为“已解决”。这样,这个帖子就能更好地与StackOverflow的算法协作,并且你也可能在各处获得更多的赞 :) - Michael0x2a
1个回答

10

Python中的分段错误有两个原因:

你的内存用完了

C模块中的错误

这里,分段错误属于第一个原因。你(我)在iterator_mergesort()函数中没有设置基本情况,导致无限递归调用自身。

通常情况下,Python会抛出异常并在引起分段错误之前终止程序。但是,由于递归深度被设置得非常高,因此Python会在耗尽内存之前崩溃,而不会意识到应该为无界递归抛出异常。

像这样添加一个基本情况:

...
def iterator_mergesort(iterator, size):
return heapq.merge(
         iterator_mergesort(
           (iterator.next() for _ in xrange(size/2)), size/2),
         iterator_mergesort(
            iterator, size - (size/2))
       ) if size >= 2 else iterator #<-- Specifically this

现在它通过了test()函数并排序,尽管速度相对较慢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接