我发现标准的Ubuntu Emacs Python解释器不是特别适合使用。考虑一下Emacs中的这个小程序:
print ['hello'] * 10000
使用C-c C-p和C-c C-r标记代码块我在Python解释器窗口中得到一个慢速输出。
如果我尝试使用C-x o C-c C-c停止输出,那么Emacs在接近100%的负载下运行会得到非常慢的响应。一段时间后我得到了KeyboardInterrupt,但是Python提示下的任何输入都很慢。这使得Emacs Python对我无法使用。
我想知道我是否缺少任何设置?
答案 0 :(得分:2)
我可以确认,当您查看非常长的行,行> = 10,000个字符时,Emacs通常会变慢。没有简单的解决方法。 Emacs被设计为文本编辑器,源代码很少超过200个字符。
“解决方案”是对长线视而不见。例如,在运行print ["hello"] * 10000
时,您可以通过转到缓冲区顶部(M-<
)来“远离”。该命令将运行得更快,根据我的经验,这样做的速度提高了大约10倍。
在打印完所有文本后,Emacs仍然很慢,因为该行仍在查看中。将其滚出视图的简单方法是print "\n" * 50
。
一般来说,我尽量避免打印长线。例如,如果print a
恰好打印出来,我可能会将其更改为print "\n".join(a)
或print a[:10]
。
答案 1 :(得分:2)
根据@ j-f-sebastian关于上述评论sys.displayhook
和repr()
大小的建议,这里有几次尝试:
from __future__ import print_function
import sys, textwrap
sys.displayhook = lambda value: print("\n".join(textwrap.wrap(repr(value), 80))) if type(value) == list else sys.__displayhook__(value)
以上内容包含行并且显示数据的速度仍然很慢,但在显示数据后,提示响应速度更快。
以下简单地限制了所有类型的输出:
from __future__ import print_function
import sys
sys.displayhook = lambda value: print(repr(value)[:200])
这是一个稍微提供更多信息的版本(并且输出更长):
from __future__ import print_function
import sys
sys.displayhook = lambda value: print(repr(value)) if len(repr(value)) < 1000 else print("%s ..." % repr(value)[:997])
要重置:
sys.displayhook = sys.__displayhook__