Python 分段错误



这会产生一个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

中的Segmentation Faults发生有两个原因之一:

内存不足

C 模块中的错误

在这里,赛格故障属于第一个。你(I)有一个无限的递归,因为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() 函数并进行排序,尽管速度相当慢。

最新更新