奇怪的Python纹行为

2024-04-19 14:58:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python2.7脚本中使用print语句,在该脚本中创建数据建模类的实例。它们是相当大的类,在init期间在属性设置器中执行大量计算,因此它不是执行最快的脚本。我使用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语句的?就好像解释器将新行字符视为应该开始查看代码的后面部分的指示。你知道吗


Tags: 实例代码import脚本datamodel属性错误
1条回答
网友
1楼 · 发布于 2024-04-19 14:58:11

默认情况下,print调用是缓冲的。每当遇到换行符时,就会刷新缓冲区(因此,会出现Done\n)。但是,后续文本将保留在缓冲区中,直到下一个刷新它的事件发生(如果没有要打印的后续换行符,则可能是Python返回命令提示符或完全退出shell,具体取决于您运行此脚本的方式)。因此,对SecondModel().fit()的耗时调用发生在两行的显示之间。你知道吗

为了避免这种情况,可以通过在print之后立即调用sys.stdout.flush()来手动刷新缓冲区。或者,如果您要使用python3.3或更高版本,您可以通过将附加参数flush=True传递到print()来简化此操作。你知道吗

错误消息可以中断printed输出,反之亦然,因为默认情况下,它们分别由两个独立的流处理:sys.stderrsys.stdout。这两个流有单独的缓冲区。你知道吗

相关问题 更多 >