2013-10-01 174 views
11

這生成Segmentation Fault: 11,我不知道爲什麼。Python分割錯誤?

之前,我到了,這裏是代碼:

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已經崩潰。我不知道在哪裏看或如何調試這個,所以任何幫助將不勝感激。

+0

通常情況下,只有當你內存不足或者你正在使用的C模塊中有一個錯誤時,纔會在python中獲得段錯誤。 [這個問題](http://stackoverflow.com/questions/10035541/what-c​​auses-a-python-segmentation-fault)可能對你有用。 – rnorris

+0

哦,我現在覺得很愚蠢,我忘記在mergesort中粘住一個基本案例,所以增加遞歸限制會打破所有事情。 – reem

+3

@sortfiend - 如果您發現問題,您應該將其寫爲[簡短回答並接受它](http://meta.stackoverflow.com/help/self-answer),而不是將標題編輯爲說「已解決」。這樣,這篇文章將會更好的用StackOverflow的算法,你可能會在這裏和那裏累積更多的upvotes :) – Michael0x2a

回答

6

Segmentation Faults在蟒蛇發生的兩個原因之一:

你耗盡內存

錯誤C模塊中

這裏的,賽格故障屬於第一。你(我)有一個無限的遞歸,因爲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 

現在通過測試()函數和排序,儘管相當緩慢。