gpt4 book ai didi

python - Python 段错误?

转载 作者:太空狗 更新时间:2023-10-29 18:06:37 24 4
gpt4 key购买 nike

这会生成一个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 模块中的错误

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

关于python - Python 段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19127777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com