Une erreur de segmentation Python?
Cela génère un Segmentation Fault: 11
et je n'ai aucune idée pourquoi.
Avant d'entrer en elle, voici le code:
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()
Fondamentalement, c'est juste un mergesort qui fonctionne sur les itérateurs et générateur d'expressions au lieu de travailler sur des listes de manière à minimiser l'empreinte mémoire à tout moment. C'est rien de spécial, et utilise le heapq.merge() méthode intégrée pour la fusion des itérateurs, j'ai donc été très surpris quand tout se casse.
L'exécution du code donne rapidement Segmentation Fault: 11
et une fenêtre d'erreur me disant python s'est écrasé. Je n'ai aucune idée de où chercher ni comment déboguer, de telle sorte que toute aide serait grandement appréciée.
source d'informationauteur reem
Vous devez vous connecter pour publier un commentaire.
Segmentation Faults
en python se produire pour l'une des deux raisons suivantes:Vous manquez de mémoire
Bug dans le module C
Ici, le seg fault appartient à la première. (I) vous avez une récursivité infinie, car il n'y a pas de cas de base dans iterator_mergesort(), il va continuer à l'appeler lui-même sur lui-même pour toujours et à jamais.
Normalement, python renvoie une exception pour tout cela et il va y mettre fin avant de provoquer une erreur de segmentation. Toutefois, la limite de la récursivité a été très élevé, de sorte python est à court de mémoire et de pauses avant qu'il reconnaît qu'il doit lever une exception, pour une utilisation illimitée de l'récursivité.
Ajouter un cas de base comme:
Maintenant il passe le test() et la fonction sortes, mais assez lentement.