Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的函数比python快';s打印功能处于空闲状态?_Python_Python 3.x_Printing_Python Idle - Fatal编程技术网

为什么我的函数比python快';s打印功能处于空闲状态?

为什么我的函数比python快';s打印功能处于空闲状态?,python,python-3.x,printing,python-idle,Python,Python 3.x,Printing,Python Idle,我不久前写过这个函数: def faster_print(*args,sep=“”,end=“\n”,file=stdout): file.write(sep.join(map(str,args))+end) 我测试了它: from sys import stdout from time import perf_counter def faster_print(*args, sep=" ", end="\n", file=stdout): fi

我不久前写过这个函数:

def faster_print(*args,sep=“”,end=“\n”,file=stdout):
file.write(sep.join(map(str,args))+end)
我测试了它:

from sys import stdout
from time import perf_counter

def faster_print(*args, sep=" ", end="\n", file=stdout):
    file.write(sep.join(map(str, args))+end)

def time(function, *args, **kwargs):
    start = perf_counter()
    function(*args, **kwargs)
    return perf_counter()-start

def using_normal_print(number):
    for i in range(number):
        print("Hello world.", 5, 5.0, ..., str)

def using_faster_print(number):
    for i in range(number):
        faster_print("Hello world.", 5, 5.0, ..., str)

normal_time = time(using_normal_print, number=100)
faster_time = time(using_faster_print, number=100)

print("Normal print:", normal_time)
print("My print function", faster_time)
事实证明,它只是在空闲时更快,而不是cmd。我知道IDLE为
sys.stdout
sys.stdin
sys.stderr
创建了自己的对象,但我不明白为什么它只会减慢python内置的
print
功能。答案是内置的
print
函数是用c编写的。由于我的函数需要从python字节码编译成机器码,这难道不应该加快速度吗


我正在使用Python 3.7.9和IDLE版本3.7.9,感谢您报告和修改您的实验。作为一名空转维护人员,我关心空转速度。我注意到,打印到屏幕有时比Python终端/控制台REPL慢得多。在后者中,Python在与屏幕窗口相同的过程中执行,screen.write直接写入屏幕缓冲区。另一方面,IDLE在单独的进程中执行用户代码。在该过程中,替换sys.stdout通过套接字将输出发送到空闲GUI进程,该进程随后调用tkinter text.insert,该进程调用tcl/tk函数,这些函数会写入屏幕bug。但直到现在,我还没有进行适当的调查

我在Win 10机器上用3.10.0a5运行了你的代码。在REPL中,正常和快速打印需要0.05秒。在空闲状态下,他们花了大约1.1秒和0.3秒。6(.3/.05)的系数由上述开销解释。但是附加系数大约是3.7(1.1/.3)

为了验证kaya3的第二个假设,我定义了
s='a'*75
,并将打印参数替换为
s
。在REPL中,时间仍然是.05和.05。在空闲状态下,它们约为.41和.31。我的结论是,有一点内部打印功能开销,但3.7中的大部分是额外的套接字到屏幕开销。当print写入缓冲区时,没有理由预先连接小字符串,因为多个stdout.write实际上是在连接,无论是连接到屏幕缓冲区还是磁盘缓冲区

为了进一步测试这一点,我修改了测试,写了3块40行的代码。REPL时间保持不变。在空闲状态下,它们的平均速度约为.058和.05,大约与REPL中的速度相同


结论:我应该记录下,如果一个人打印的代码是在空闲状态下正常运行的,而他关心的是速度,那么他应该首先将想要显示的所有内容预组装成一个字符串,然后只打印该字符串。IDLE为回溯执行此操作,这就是为什么它们显示“一次全部”。

datetime.now()
不一定准确;您应该使用“具有最高可用分辨率的时钟来测量短持续时间”,或者您可以使用该模块,而不是滚动您自己的计时代码。不要使用
datetime.now()进行基准测试。你应该使用
时间。改为使用process\u time
。好的,我会尝试一下,然后使用timeit更新问题。它们在1k中大致相同iterations@TeejayBruno你在用空闲的吗?什么版本?谢谢你的详细回答。因此,提高空闲速度的唯一方法是,在写入
stdout
之前,强制cpython加入传递到其
print
函数中的参数。我建议关心的用户应该加入参数,可能还有行,并使用单个字符串参数调用print。我现在在空闲文档中添加了一段关于此的内容。有一次,我在Shell中填充了500000行40个字符的行,以查看滚动是否仍然正常工作(是的,确实如此)。一次打印1000行会更快;-)。我考虑过替换内置的
打印
,但这会有精确模拟的问题,即使模拟非常完美,也会使IDLE有所不同。我认为这不是一个好建议,但如果IDLE将所有stdout写入一个缓冲区,并在几毫秒后写入tkinter,会怎么样。用
.after
脚本实现应该不难。否则,如果每个人都在打印很多东西,那么他们应该加入打印参数。运行用户代码的部分原因是第二个进程,这样用户tkinter代码和IDLE的GUI tkinter代码就不会相互干扰。因此,设置执行进程及其与gui进程的连接的idlelib.run不会运行tkinter/tk代码。连接是在单独的线程中处理的,因此我考虑在等待时让该线程睡眠,但我怀疑这也不会起作用,因为睡眠不能中断,而Windows的最小睡眠是,我相信至少16千秒。