windows Python IDLE正在重新启动,但没有给我输出

lokaqttq  于 6个月前  发布在  Windows
关注(0)|答案(2)|浏览(69)

我在实现快速排序算法时遇到了一个问题,就像在这个例子中一样,python interpretor automaticlly restarting without returning answer。我找不到比这个更相似的问题。由于这篇文章自2012年以来一直处于非活动状态,问题没有得到解决,我决定再问一次。下面是我的代码:

#coding:utf8

import time
import sys
sys.setrecursionlimit(1000000)
x=eval(input("Type a list: "))
start=time.time()
L=[]
R=[]
L_=[]
R_=[]
c=0
z=x[0]
for j in range(1,len(x)):
    if x[j]>= z:
        R.append(x[j])
    elif x[j] <= z:
        L.append(x[j])
def fun(x,lista,c):
    for i in range(len(x)-1):
        for j in range(i+1,i+2):
            if x[i]<=x[j] and c!=len(x)-2:
                c+=1
            elif x[i]>x[j]:
                lista.append(x[i])
                lista.append(x[j])
                x[i]=lista[1]
                x[j]=lista[0]
                lista=[]
                c=0
                return fun(x,lista,c)
            elif x[i]<=x[j] and c==len(x)-2:
                    c=0
                    return x
fun(L,L_,c)
fun(R,R_,c)

print(L+[z]+R)
end=time.time() 
print(end-start)

字符串
我使用的Python版本是3.4。正如你所看到的,我使用了sys库来增加递归限制,但它没有解决我的问题。我测试了它,它可以对300>X>250范围内的X数量的元素进行排序,如果我是对的。我如何解决这个问题?提前谢谢你。

yb3bgrhw

yb3bgrhw1#

Idle通常(除非使用-n启动)在用户子进程中运行用户代码。RESTART行意味着子进程已经重新启动。无论如何启动Idle(不使用-n),当选择Shell -> Restart Shell Cntl+F6或Run -> Run Module F5时,都会发生这种情况。
如果用户进程由于程序错误而崩溃,也会发生RESTART。如果从命令行(python -m idlelib,或2.x中的... idlelib.idle)启动Idle,那里可能会出现错误消息,但这不会发生在您的程序中。
在用一个具体的赋值替换了输入行之后,我用3.4.3运行了你的程序(你应该在发布之前就完成了)。

x = list(reversed(range(1000)))

字符串
(This特定的选择对于许多排序算法来说是最坏的情况)。
我在命令窗口中没有看到任何东西,但确实看到了python.exe停止工作的Windows消息。由于Idle仍在运行,这是指错误进程。
将1000000减少到10000并没有改变任何东西,将递归限制留在1000会导致长时间的回溯。

Traceback (most recent call last):
  File "C:\Programs\python34\tem.py", line 33, in <module>
    fun(L,L_,c)
  File "C:\Programs\python34\tem.py", line 29, in fun
    return fun(x,lista,c)
....
  File "C:\Programs\python34\tem.py", line 29, in fun
    return fun(x,lista,c)
  File "C:\Programs\python34\tem.py", line 18, in fun
    for i in range(len(x)-1):
RuntimeError: maximum recursion depth exceeded in comparison


将列表的大小减少到100并没有改变结果。你有一个无限循环,你需要防止。
你的代码看起来不像我熟悉的快速排序版本,也许你应该回顾一下算法的定义。
然而,这一行的j in range(i+1,i+2):看起来像一个bug,因为它只迭代了一次,j = i+1。事实上,如果你用这一行替换它,程序会运行相同的代码。
在任何情况下,终止条件x[i]<=x[j] and c==len(x)-2都不满足。我建议从一个只有几个项目的简短列表开始,并将from print语句添加到fun,以查看值与预期的偏差。您也可以尝试手动执行算法。

qyuhtwio

qyuhtwio2#

我正要问同样的问题,于是就问了stackoverflow。
我的Python在长的Python程序中重新启动,更具体地说,主要是在程序调用外部程序时(例如在调用FFMPEG或使用system.os命令调用Tesseract时)。
我的搜索让我在stackoverflow上找到了4个问题,我了解到了以下内容:
Python IDLE在一个子进程中运行用户代码,如果这个子进程崩溃,RESTART就会发生。(感谢Terry Jan Reedy)。
我相信这是我的问题(子进程崩溃)。
起初,我以为这是一个硬件问题:我测试了我的CPU,检查了我的硬盘,用Memtest测试了我的RAM.没有检测到错误。
然后我在我的第二台电脑上运行我的程序,这和我的第一台电脑完全一样:在第二台电脑上一切正常,但在我的第一台电脑上就不行了。
在那之后,我运行了一个SystemFileCheck(我使用的是Windows),看到我的操作系统有问题,它无法解决。
最后,我删除了操作系统分区,并重新安装Windows.
现在一切都很好。-->所以我的Windows无缘无故地杀死了我的Python进程。
结论:

  • 如果用户子进程崩溃,Python中的Buggy RESTART就会发生。这种崩溃可能来自程序中的bug(无限循环,内存占用)或损坏的操作系统。

修复:检查您的程序的错误,并修复或重新安装您的操作系统。

相关问题