Ошибка сегментации 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 разбился. Я понятия не имею, где искать или как отлаживать этот, так что любая помощь будет высоко оценена.

One Solution collect form web for “Ошибка сегментации Python?”

Segmentation Faults в python происходят по одной из двух причин:

У вас не хватает памяти

Ошибка в модуле C

Здесь seg-ошибка принадлежит первому. У вас (я) есть безграничная рекурсия, потому что в iterator_mergesort () нет базового аргумента, он будет постоянно называть себя навсегда.

Обычно 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 () и сортирует, хотя и довольно медленно.

  • Дождитесь завершения задачи на удаленном компьютере через Python
  • получить имена динамических фреймов w / Selenium WebDriver и Python?
  • python 2.7 наличие в словаре
  • wxPython через py2app: «нет соответствующей 64-битной архитектуры» ОШИБКА, хотя 32-битный набор предпочтений
  • Как я могу щелкнуть кнопку в форме с помощью Selenium и Python 2.7?
  • Добавление нового столбца в кадр данных после вычисления во времени
  • Unflattening список в python
  • Преобразование списка в строку и обратно
  • Python - лучший язык программирования в мире.