好奇 python 打印行为
Curious python print behavior
我在 python 2.7 脚本中使用打印语句,我在其中创建数据建模实例 类。它们相当大 类,在初始化期间在 属性 setter 中进行大量计算,因此它不是执行速度最快的脚本。我使用 print 语句来了解进度,但有趣的是它们是如何执行的。代码看起来像这样:
from __future__ import absolute_import, division, print_function, unicode_literals
print('Loading data...', end='\t')
data = LoadData(data_path)
first_model = FirstModel(parameters).fit(data)
print('Done.\nFitting second model...', end='\t')
# prints 'Done.' and then there's a very long pause...
# suddenly 'Fitting second model...' prints and the next model initializes almost immediately
second_model = SecondModel(parameters).fit(data)
results = second_model.forecast(future_dates)
为什么语句print('Done.\nFitting second model...', end=\t')
会先打印'Done.'然后停顿很长一段时间?有一个例子,当我是 运行 这段代码时,在 'Done.' 打印之后,我在 在 语句的其余部分打印之前得到了一个错误。返回的错误是 SecondModel 中的错误,我也尝试将方法作为属性访问。这里发生了什么? python 如何或为什么以这种违反直觉的方式执行此打印语句?就好像解释器将换行符视为它应该开始查看代码后面部分的指示。
默认情况下,print
调用会被缓冲。每当遇到换行符时都会刷新缓冲区(因此,您会看到 Done\n
出现)。但是,后续文本将保留在缓冲区中,直到下一个刷新它的事件(在没有要打印的后续换行符的情况下,可能 Python 要么返回到命令提示符,要么完全退出到shell,取决于你如何 运行 这个脚本)。因此,您对 SecondModel().fit()
的耗时调用发生在 两行的显示之间。
为避免这种情况,您可以在 print
之后立即调用 sys.stdout.flush()
手动刷新缓冲区。或者,如果您要迁移到 Python 3.3 或更高版本,您可以通过将附加参数 flush=True
传递到 print()
.
来简化此操作
错误消息会中断 print
ed 输出,反之亦然,因为默认情况下它们分别由两个单独的流处理:sys.stderr
和 sys.stdout
。这两个流有单独的缓冲区。
我在 python 2.7 脚本中使用打印语句,我在其中创建数据建模实例 类。它们相当大 类,在初始化期间在 属性 setter 中进行大量计算,因此它不是执行速度最快的脚本。我使用 print 语句来了解进度,但有趣的是它们是如何执行的。代码看起来像这样:
from __future__ import absolute_import, division, print_function, unicode_literals
print('Loading data...', end='\t')
data = LoadData(data_path)
first_model = FirstModel(parameters).fit(data)
print('Done.\nFitting second model...', end='\t')
# prints 'Done.' and then there's a very long pause...
# suddenly 'Fitting second model...' prints and the next model initializes almost immediately
second_model = SecondModel(parameters).fit(data)
results = second_model.forecast(future_dates)
为什么语句print('Done.\nFitting second model...', end=\t')
会先打印'Done.'然后停顿很长一段时间?有一个例子,当我是 运行 这段代码时,在 'Done.' 打印之后,我在 在 语句的其余部分打印之前得到了一个错误。返回的错误是 SecondModel 中的错误,我也尝试将方法作为属性访问。这里发生了什么? python 如何或为什么以这种违反直觉的方式执行此打印语句?就好像解释器将换行符视为它应该开始查看代码后面部分的指示。
默认情况下,print
调用会被缓冲。每当遇到换行符时都会刷新缓冲区(因此,您会看到 Done\n
出现)。但是,后续文本将保留在缓冲区中,直到下一个刷新它的事件(在没有要打印的后续换行符的情况下,可能 Python 要么返回到命令提示符,要么完全退出到shell,取决于你如何 运行 这个脚本)。因此,您对 SecondModel().fit()
的耗时调用发生在 两行的显示之间。
为避免这种情况,您可以在 print
之后立即调用 sys.stdout.flush()
手动刷新缓冲区。或者,如果您要迁移到 Python 3.3 或更高版本,您可以通过将附加参数 flush=True
传递到 print()
.
错误消息会中断 print
ed 输出,反之亦然,因为默认情况下它们分别由两个单独的流处理:sys.stderr
和 sys.stdout
。这两个流有单独的缓冲区。