Python print语句中涉及多少条计算机指令?

tal*_*ees 0 python printing performance

我问这个问题是因为当使用重复的print语句调试循环时,它会使程序的运行速度降低到我原本预期的程度.我已经习惯了这个,但现在我很好奇为什么会出现这种情况的技术原因?在我看来,变量的各种计算和分配比输出字符串更昂贵.

小智 6

相当多,但另一个重要(甚至是最重要的)瓶颈与CPU无关:I/O开销.一旦调度了字节码指令并且所有参数都已转换为字符串,就会调用一个函数来写入这些字符串sys.stdout.根据您的系统和运行程序的方式,这可能是:

  1. 磁盘上的文件
  2. 来自终端仿真器的管道
  3. 一些Python对象捕获输出(这是IDLE做的IIRC)来做谁知道什么(捕获它,把它放入GUI等).

在#1的情况下,涉及磁盘I/O,这比写入RAM要容易一个数量级.与今天的CPU相比,RAM已经非常慢了.正如评论中所指出的那样,由于操作系统和Python的广泛缓冲,这不是一个问题,但仍然需要时间来发出写入(并且(取决于我不太了解的实现细节)它可能仍需要一些如果有人过早冲洗任何缓冲区的话.

在#2的情况下,一切都保留在内存中,但它仍然是一个系统调用,一些复制,另一端必须读取它并做一些事情让你注意到(例如在一个花哨的终端模拟器中呈现它与反...别名字体,这本身就是一项复杂的任务).它不是一个问题,因为它可以同时发生,但它仍然会加载CPU.

在#3的情况下,所有投注均已关闭.它可以使用bcrypt对输出进行散列并将其发送到月球,我们所知道.你碰巧使用IDLE吗?我记得有一个抱怨,IDLE在重定向输出时非常缓慢,特别是有很多尖齿.它必须捕获输出,将其与输出连接到目前为止,让Tkinter渲染它.