Python崩溃了大量的输入

时间:2015-03-25 22:32:51

标签: python input crash

我正在尝试运行一个包含大量输入的python程序。 它适用于1k输入,但是当我尝试使用1M时,它就会永远冻结。

这是我阅读输入的方式:

这是我的主要内容:

def main():

  global raiz  
  inputs = raw_input()
  output = []
  inputs = inputs.lower()
  split = inputs.split(" ")
  while (inputs!=""):
      if (split[0] == "pass"):
          if (split[2] == "r"):
              novo = No(split[1].upper(), 1, True)
          else:
              novo = No(split[1].upper(), 1, False)

          if raiz == None:
              raiz = novo
          else:
              encontraNo(novo)

      elif (split[0] == "status"):
          if (raiz == None):
              output.append(split[1].upper()+" NO RECORD")
          else:
              novo = No(split[1].upper(), 0, False)
              output.append(procuraStatus(novo))
      elif (split[0] == "unflag"):
          if (raiz != None):
              novo = No(split[1].upper(),0, False)
              actualizaEstado(novo)
      inputs = raw_input()
      inputs = inputs.lower()
      split = inputs.split(" ")        


  for out in output:
      print out    
main()

我可以“输入”我的程序是否有输入限制? 我正在使用Wing IDE 5.0。 我可以发布我的其余代码,但我不认为这个问题与它有关,而是与我可以提供给python程序的输入限制相关

编辑:

我尝试在控制台上运行它,它在50k输入下运行良好。 但是,当我运行100万个输入并让它工作(大约2个小时)时,我没有结果,所以我停止了程序。这是我在控制台中得到的:

C:\Users\Tomás\Documents\Engenharia Informática\PYTHON>python TP2C.py
Traceback (most recent call last):
  File "TP2C.py", line 210, in <module>
    main()


C:\Users\Tomás\Documents\Engenharia Informática\PYTHON>python TP2C.py < F50K.txt

A15833 5 R

C:\Users\Tomás\Documents\Engenharia Informática\PYTHON>python TP2C.py < F1M.txt
Traceback (most recent call last):
  File "TP2C.py", line 210, in <module>
    main()
  File "TP2C.py", line 191, in main
    encontraNo(novo)
  File "TP2C.py", line 84, in encontraNo
    valor_matricula_noActual = ''.join(str(ord(c)) for c in so)
  File "TP2C.py", line 84, in <genexpr>
    valor_matricula_noActual = ''.join(str(ord(c)) for c in so)
KeyboardInterrupt

C:\Users\Tomás\Documents\Engenharia Informática\PYTHON>

这是我的完整代码,如果你想查看它......

class No_Avl(object):




    def __init__(self, matricula, estado, numero):
        self.filhoDireito = None
        self.filhoEsquerdo = None
        self.matricula = matricula
        self.numero = numero
        self.estado = estado
        self.altura = 0


class Arvore_Avl(object):
    global raiz




    def __init__(self):
        global raiz
        raiz = None

    def altura(self,noActual):
        if (noActual == None):
            return (-1)
        return noActual.altura

    def adicionaNoo(self, matricula, estado, numero):
        global raiz
        raiz = self.adicionaNo(matricula, estado, numero, raiz)

    def adicionaNo(self,matricula, estado, numero, noActual):

        if (noActual == None):
            noActual = No_Avl(matricula, estado, numero)
        elif (noActual != None):
            s = matricula
            valor_matricula = ''.join(str(ord(c)) for c in s)
            s = noActual.matricula
            valor_matricula_noActual = ''.join(str(ord(c)) for c in s)            
            if(valor_matricula < valor_matricula_noActual):
                noActual.filhoEsquerdo = self.adicionaNo(matricula, estado, numero, noActual.filhoEsquerdo)
                if (self.altura(noActual.filhoEsquerdo) - self.altura(noActual.filhoDireito) == 2):
                    s = matricula
                    valor_matricula = ''.join(str(ord(c)) for c in s)
                    s = noActual.matricula
                    valor_matricula_noActual = ''.join(str(ord(c)) for c in s)                
                    if (valor_matricula < valor_matricula_noActual):
                        noActual = self.rotateWithLeftChild(noActual)
                    else:
                        noActual = self.doubleWithLeftChild(noActual)

            elif (valor_matricula > valor_matricula_noActual):
                noActual.filhoDireito = self.adicionaNo(matricula, estado, numero, noActual.filhoDireito)
                if (self.altura(noActual.filhoDireito) - self.altura(noActual.filhoEsquerdo) == 2):
                    s = matricula
                    valor_matricula = ''.join(str(ord(c)) for c in s)
                    s = noActual.matricula
                    valor_matricula_noActual = ''.join(str(ord(c)) for c in s)                    
                    if (valor_matricula > valor_matricula_noActual):
                        noActual = self.rotateWithRightChild(noActual)
                    else:
                        noActual = self.doubleWithRightChild(noActual)

            else:
                return None
        noActual.altura = max(self.altura(noActual.filhoEsquerdo), self.altura(noActual.filhoDireito)) +1

        return noActual

    def encontraNoo(self, matricula):

        global raiz
        return self.encontraNo(matricula, raiz)    


    def encontraNo(self, matricula, noActual):

        while (noActual != None):
            s = matricula
            valor_matricula = ''.join(str(ord(c)) for c in s) 
            so = noActual.matricula
            valor_matricula_noActual = ''.join(str(ord(c)) for c in so)
            if (valor_matricula < valor_matricula_noActual):
                noActual = noActual.filhoEsquerdo
            elif (valor_matricula > valor_matricula_noActual):
                noActual = noActual.filhoDireito
            else:
                return noActual
        return None



    def rotateWithLeftChild(self, k2):
        k1 = k2.filhoEsquerdo
        k2.filhoEsquerdo = k1.filhoDireito
        k1.filhoDireito = k2
        k2.altura = max(self.altura(k2.filhoEsquerdo), self.altura(k2.filhoDireito))+1
        k1.altura = max(self.altura(k1.filhoEsquerdo), k2.altura) +1

        return k1

    def rotateWithRightChild(self, k1):
        k2 = k1.filhoDireito
        k1.filhoDireito = k2.filhoEsquerdo
        k2.filhoEsquerdo = k1
        k1.altura = max(self.altura(k1.filhoEsquerdo), self.altura(k1.filhoDireito))+1

        return k2

    def doubleWithLeftChild(self, k3):
        k3.filhoEsquerdo = rotateWithRightChild(k3.leftChild)
        return rotateWithLeftChild(k3)

    def doubleWithRightChild(self, k1):
        k1.filhoDireito = rotateWithLeftChild(k1.filhoDireito)
        return rotateWithRightChild(k1)

def main():

    global raiz
    arvore = Arvore_Avl()

    inputs = raw_input()
    inputs = inputs.lower()
    split = inputs.split(" ")
    while (inputs!=""):

        if (split[0] == "pass"):

            if(arvore.encontraNoo(split[1]) != None):
                arvore.encontraNoo(split[1]).numero += 1
                arvore.encontraNoo(split[1]).estado = split[2]
            else:
                arvore.adicionaNoo(split[1], split[2], 1)

        elif (split[0] == "status"):
            mat = split[1]

            if (arvore.encontraNoo(mat)!= None):
                print(split[1].upper() + " "+ str(arvore.encontraNoo(split[1]).numero) + " "+arvore.encontraNoo(split[1]).estado.upper())

            else:
                print(split[1].upper()+" NO RECORD")

        elif (split[0] == "unflag"):
            if (arvore.encontraNoo(split[1]) != None):
                arvore.encontraNoo(split[1]).estado = "R"
        inputs = raw_input()
        inputs = inputs.lower()
        split = inputs.split(" ")        


main()

0 个答案:

没有答案