Python分段错误?

2024-05-23 19:43:08 发布

您现在位置: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已经崩溃。我不知道在哪里寻找或如何调试这个,所以任何帮助将非常感谢。


Tags: 代码importsizedefsyslowlimitheapq
1条回答
网友
1楼 · 发布于 2024-05-23 19:43:08

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

内存不足

C模块中的错误

在这里,seg断层属于第一个断层。你(我)有一个无限递归,因为迭代器_mergesort()中没有基case,它会一直调用自己。

通常,python对此抛出一个异常,它将在导致segfault之前终止。但是,递归限制被设置得非常高,因此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()函数并进行排序,尽管速度很慢。

相关问题 更多 >