Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.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/6/ant/2.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
Windows中Python的缓冲输出与非缓冲输出_Python_Notepad++_Nppexec_Unbuffered Output - Fatal编程技术网

Windows中Python的缓冲输出与非缓冲输出

Windows中Python的缓冲输出与非缓冲输出,python,notepad++,nppexec,unbuffered-output,Python,Notepad++,Nppexec,Unbuffered Output,我使用NppExec/Notepad++运行Python脚本,并在运行时不断刷新输出缓冲区,以使用print语句更新控制台窗口(默认缓冲输出仅显示脚本完成执行后的所有print语句) 链接显示,您只需使用命令python-u即可获得无缓冲输出。无论使用何种编辑器,对所有我的Python脚本使用此执行模式是否有缺点?我不清楚缓冲输出和非缓冲输出之间的区别 编辑:我包括了这个小型Python计时器脚本作为示例: #!usr/bin/env python import time import thre

我使用NppExec/Notepad++运行Python脚本,并在运行时不断刷新输出缓冲区,以使用
print
语句更新控制台窗口(默认缓冲输出仅显示脚本完成执行后的所有print语句)

链接显示,您只需使用命令
python-u
即可获得无缓冲输出。无论使用何种编辑器,对所有我的Python脚本使用此执行模式是否有缺点?我不清楚缓冲输出和非缓冲输出之间的区别

编辑:我包括了这个小型Python计时器脚本作为示例:

#!usr/bin/env python
import time
import threading
import sys

class Timer(threading.Thread):
    def __init__(self, seconds):
        self.runTime = seconds
        threading.Thread.__init__(self)
    def run(self):
        counter = self.runTime
        for sec in range(self.runTime):
            print counter
            time.sleep(1.0)
            counter -= 1
        print "Done."

if __name__ == '__main__':
    t = Timer(10)
    t.start()

在这种情况下,缓冲输出和非缓冲输出在效率方面有多大差别?

缓冲输出意味着计算机将输出假脱机到内存中的某个位置,直到累积了一定量。然后它一次写入整个块。这比使用无缓冲输出更有效,无缓冲输出在您请求写入输出时立即写入

不利的一面是,根据您编写的输出量,您的程序将运行得稍慢(或慢得多)。如果它们是不做太多输出的短程序,那么您不太可能注意到它们之间的差异

编辑


缓冲与非缓冲输出不仅仅是python的问题。同样的概念(和术语)也适用于其他语言。在低级语言中,它在某些方面变得更为重要——如果我使用缓冲输出在C程序中写入消息,然后我的程序由于编程错误而死亡,那么在错误发生之前假脱机但未写入磁盘的任何数据都将丢失。这不是一个问题,因为让python解释器在出现错误时中止是相当困难的——即使您的代码不好,解释器最终仍能正常清理…(除非您向它发送kill信号或其他东西)

我可以想到两个缺点,但它们的重要性取决于您的需要:

  • 无缓冲的读写速度可能会明显较慢;如果您一次只写一行文本文件,您的代码可能会进行数百次系统调用,要求操作系统编写该文件。根据写入磁盘的速度,这甚至可能意味着需要从磁盘重新读取文件的最后一块,以便使用新的最后一行重新保存文件。(这可能很少见;但更多的系统调用几乎总是导致速度变慢的原因。)

    下面是对写入速度有很大影响的系统调用数量的简单演示:

    $ cat initrd.img-2.6.38-8-generic > /dev/null
    
    第一行确保文件在缓存中,因此只测量输出速度

    $ dd if=initrd.img-2.6.38-8-generic of=/tmp/out bs=16 oflag=dsync
    ^C262766+0 records in
    262766+0 records out
    4204256 bytes (4.2 MB) copied, 50.7754 s, 82.8 kB/s
    
    我放弃了等待,因为它太慢了。这是一次“无缓冲”地将16个字节写入磁盘,并确保每次写入都成功,然后再进行下一次写入。(这是
    dsync
    ——稍后将详细介绍。)

    这两个命令显示了一些缓冲的效果——第一个命令以4096字节的块写入数据,这可能是默认缓冲提供给您的。这一次大约比16字节快50倍。第二个命令是以40960字节的数据块写入数据,速度大约快了9倍。(总的来说,一次写入40960字节比一次写入16字节快大约345倍。)

    如果你的数据很小,这并不重要。毕竟,这两种方式都不会花太多时间。如果您的数据很大,它可能更重要,这取决于您一次写入的数据量以及它在底层设备的“字节边界”上排列的频率

  • 套接字上的某些协议可能会根据您发送的数据的时间改变其行为。如果您以增量方式构建数据,则可能会在单个数据包中发送部分数据,而基于数据包的接收器可能无法正常处理该数据包。(对于我来说,除了驾驶某种游戏之外,很难想象基于TCP的系统会出现这种问题;基于UDP的系统更容易想象会出现这种问题。)


  • 你的例子有点超出我的理解力!你能看一下我的问题并解释一下吗?感谢您的详细回复!我不太清楚“数据是小是大”。这是否意味着我要打印的行数?我通过consoleOK在本地运行所有Python文件,我想我的问题已经得到了回答。谢谢哈,再次显示了要求更多上下文的重要性。您的代码非常小,而且做的很少,因此性能并不重要——但正确性确实重要。通过在
    print
    语句之后立即添加flush命令,可以让程序正常工作,但老实说,它的工作原理是相同的。只要使用
    -u
    就可以快乐了。:)如果我的代码运行时间远远大于打印几行更新以通知用户运行进度所需的时间,那么我可以安全地使用
    python-u
    ,而不必担心。希望我在这里是对的,你能详细介绍一下“短”和“长”节目吗?它与浮点运算、迭代、算法复杂性或我放置的打印命令数有关吗?我还编辑了我的question@prrao它与打印命令的数量有关——一次写入的字节数。在您的示例中,time.sleep函数的完成时间要比IO长得多,因为它只有1条打印语句。所以,举个例子,无缓冲IO是可以的。一般来说,最简单的方法是计时(使用
    timeit
    模块),看看是否有明显的差异。
    $ dd if=initrd.img-2.6.38-8-generic of=/tmp/out bs=$((4096)) oflag=dsync
    3218+1 records in
    3218+1 records out
    13181130 bytes (13 MB) copied, 3.69961 s, 3.6 MB/s
    $ dd if=initrd.img-2.6.38-8-generic of=/tmp/out bs=$((4096 * 10)) oflag=dsync
    321+1 records in
    321+1 records out
    13181130 bytes (13 MB) copied, 0.471143 s, 28.0 MB/s