python print影响速度_为什么打印到标准输出这么慢?可以加快速度吗?

本文探讨了Python print语句输出到终端为何比写入文件或重定向到/dev/null慢的问题。通过测试发现,输出到终端的延迟主要由终端处理输入和渲染屏幕造成。即使缩小终端窗口,速度仍显著慢于直接写入文件。作者希望找到一种方法从应用程序端优化这一行为,或者理解为何终端的渲染会阻碍写入速度。
部署运行你感兴趣的模型镜像

我一直对使用print语句简单地输出到终端需要多长时间感到惊讶/沮丧。在经历了最近令人痛苦的缓慢日志记录之后,我决定进行调查,并惊讶地发现几乎所有的时间都在等待终端处理结果。

可以以某种方式加快对stdout的写入速度吗?

我编写了一个脚本(print_timer.py此问题底部的' ')来比较将100k行写入stdout,文件以及将stdout重定向到时的时序/dev/null。计时结果如下:

$ python print_timer.py

this is a test

this is a test

this is a test

-----

timing summary (100k lines each)

-----

print                         :11.950 s

write to file (+ fsync)       : 0.122 s

print with stdout = /dev/null : 0.050 s

哇。为了确保python在幕后不做任何事情,例如认识到我将stdout重新分配给/ dev / null之类的东西,我在脚本之外进行了重定向...

$ python print_timer.py > /dev/null

-----

timing summary (100k lines each)

-----

print                         : 0.053 s

write to file (+fsync)        : 0.108 s

print with stdout = /dev/null : 0.045 s

因此,这不是python技巧,而仅仅是终端。我一直都知道将输出转储到/ dev / null会加快速度,但是从来没有想到它是如此重要!

令我惊讶的是tty这么慢。写入物理磁盘比写入“屏幕”(大概是全RAM操作)要快得多,并且实际上与使用/ dev / null转储到垃圾中一样快?

该链接讨论了终端如何阻止I / O,以便它可以“解析[输入],更新其帧缓冲区,与X服务器通信以滚动窗口等等” ……但是我不知道完全得到它。可能要花这么长时间?

我希望没有出路(缺少更快的tty实现?),但无论如何我都会问。

更新:阅读了一些评论后,我想知道我的屏幕尺寸实际上对打印时间有多大影响,这确实有一定意义。上面最慢的数字是我的Gnome终端被炸毁为1920x1200。如果将其减小得很小,我会得到...

-----

timing summary (100k lines each)

-----

print                         : 2.920 s

write to file (+fsync)        : 0.121 s

print with stdout = /dev/null : 0.048 s

那当然更好(〜4倍),但不会改变我的问题。这只会增加我的问题,因为我不明白为什么终端屏幕渲染会减慢应用程序向stdout的写入速度。为什么我的程序需要等待屏幕渲染继续?

是否所有创建的终端/ tty应用程序都不相等?我还没有实验。在我看来,终端确实应该能够缓冲所有传入的数据,以不可见的方式解析/渲染它们,并且仅以合理的帧速率渲染在当前屏幕配置中可见的最新块。因此,如果我可以在约0.1秒内将+ fsync写入磁盘,则终端应该能够以该顺序完成相同的操作(在执行此操作时可能需要进行一些屏幕更新)。

我仍然希望可以从应用程序端更改tty设置,以使程序员更好地实现此行为。如果严格来说这是终端应用程序问题,那么这可能甚至不属于StackOverflow吗?

我想念什么?

这是用于生成计时的python程序:

import time, sys, tty

import os

lineCount = 100000

line = "this is a test"

summary = ""

cmd = "print"

startTime_s = time.time()

for x in range(lineCount):

print line

t = time.time() - startTime_s

summary += "%-30s:%6.3f s\n" % (cmd, t)

#Add a newline to match line outputs above...

line += "\n"

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值