【问题标题】:A Python Segmentation Fault?Python 分段错误?
【发布时间】:2013-10-08 07:07:51
【问题描述】:

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

【问题讨论】:

  • 通常,只有在内存不足或正在使用的 C 模块中存在错误时,才会在 python 中遇到段错误。 This question 可能对你有用。
  • 哦,我现在感觉很愚蠢,我忘了在我的归并排序中添加一个基本情况,所以增加递归限制会破坏一切。
  • @sortfiend -- 如果你发现了问题,你应该把它写成short answer and accept it,而不是编辑标题说“已解决”。这样一来,这篇文章将更好地使用 StackOverflow 的算法,并且您最终可能会在这里和那里积累更多的赞成票:)

标签: python python-2.7 mergesort


【解决方案1】:

Segmentation Faults 在 python 中的发生有以下两个原因之一:

内存不足

C 模块中的错误

这里,seg fault属于第一个。你(我)有一个无限的递归,因为在 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() 函数并进行了排序,尽管速度很慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多