繁体   English   中英

Python分段错误?

[英]A Python Segmentation Fault?

这会产生一个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已崩溃。 我不知道在哪里看或如何调试这个,所以任何帮助将不胜感激。

python中的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()函数并进行排序,尽管速度相当慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM