这会生成一个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()
基本上,它只是一个兼容迭代器和生成器表达式的mergesort,而不是在列表上工作,以便在任何时候最小化内存占用。它没什么特别的,并且使用了heapq.merge()内置方法来合并迭代器,所以当一切都中断时我很惊讶。
快速运行代码会给Segmentation Fault: 11
一个错误窗口,告诉我python已经崩溃了。我不知道在哪里看或如何调试这个,所以任何帮助将不胜感激。
答案 0 :(得分:8)
Segmentation Faults
由于以下两个原因之一而发生:
内存不足
C模块中的错误
这里,seg故障属于第一个。你(我)有一个无限的递归,因为在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()函数并进行排序,虽然速度很慢。