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

问题描述 投票:0回答:2

我在实现快速排序算法时遇到了问题,就像在本例中一样,python解释器自动重新启动而不返回答案。我找不到比这个更相似的问题了。由于这篇文章自 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”个元素进行排序。我怎么解决这个问题?先感谢您。

python windows restart python-idle
2个回答
0
投票

正常空闲(除非以 -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)))

(对于许多排序算法来说,这个特定的选择是最坏的情况)。

我在命令窗口中没有看到任何内容,但确实看到了 Windows 消息:python.exe 已停止工作。由于 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 并没有改变结果。你有一个无限循环,你需要防止它。

您的代码看起来不像我熟悉的快速排序版本。也许你应该回顾一下算法的定义。

但是,这条线 对于范围 (i+1,i+2) 内的 j: 看起来像一个 bug,因为它只迭代一次,带有

j = i+1
。事实上,如果您将其替换为该行并缩进以下行,则程序运行相同。

无论如何,都不满足终止条件

x[i]<=x[j] and c==len(x)-2
。我建议从只有几个项目的简短列表开始,然后将打印语句添加到
fun
以查看值与您的期望有何偏差。您也可以尝试手动执行算法。


0
投票

我正想问同样的问题,所以屈服于 stackoverflow。

我的Python在长Python程序期间重新启动,更具体地说,主要是在程序调用外部程序期间(例如在调用FFMPEG或使用system.os命令调用Tesseract期间)。

我在 stackoverflow 上搜索了 4 个问题,我了解到以下内容:

Python IDLE 在子进程中运行用户代码,如果该子进程崩溃,则会发生 RESTART。 (感谢特里·简·里迪)。

我相信这是我的问题(子进程崩溃)。

起初,我以为这是一个硬件问题:我测试了我的CPU,检查了我的硬盘,用Memtest测试了我的RAM......并且没有检测到错误。

然后我在第二台计算机上运行我的程序,这与我的第一台计算机完全相同:在第二台计算机上一切正常,但在我的第一台计算机上则不然。

之后我运行了 SystemFileCheck(我使用的是 Windows),发现我的操作系统存在无法解决的问题。

最后我删除了操作系统分区并重新安装了Windows。

现在一切都很好。 --> 所以我的 Windows 无缘无故地杀死了我的 python 进程。

结论:

  • 如果用户子进程崩溃,Python 中就会出现 buggy RESTART。 这种崩溃可能来自程序中的错误(例如,无限循环,内存已满)或损坏的操作系统。

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

© www.soinside.com 2019 - 2024. All rights reserved.