我正在尝试运行一个包含大量输入的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()