【问题标题】:Python: stdout rate is double of what it should bePython:标准输出率是应有的两倍
【发布时间】:2017-11-03 12:24:00
【问题描述】:

我在 python 2.7 中编写了一个非常简单的脚本,名为 slowcat.py,它允许我以每秒特定字节速率 cat 一个文件。现在的问题是给出的速率在输出流上翻了一番。所以 rate=1 字节导致每秒 2 字节,而 rate=4 字节导致每秒 8 字节。实际程序见代码sn-p:

#!/usr/bin/env python

import argparse
import time
import sys
import os


def get_configuration():
    """
    Returns a populated configuration
    """
    parser = argparse.ArgumentParser()
    parser.add_argument('file', metavar='FILE', type=argparse.FileType('r'),
                        nargs='?', help="Input file")
    parser.add_argument('--rate', type=int, default=666880,
                        help="Output rate in bytes per second")

    return parser.parse_args()


def main():
    cfg = get_configuration()

    size = os.path.getsize(cfg.file.name)
    bytes_read = 0

    t1 = time.time()
    while True:
        n = min(cfg.rate, size-bytes_read)
        if n <= 0:
            break
        buf = cfg.file.read(n)
        sys.stdout.write(buf)
        sys.stdout.flush()
        bytes_read += n
        t2 = time.time()
        if t2-t1 < 1.0:
            time.sleep(1.0 - (t2-t1))
        t1 = t2


if __name__ == "__main__":
    main()

现在我的问题是:为什么输出速率是我在命令行中传递的两倍?如果您复制粘贴代码 sn-p 您可以轻松地在您的系统上试用它,例如python slowcat.py --rate 2 slowcat.py

【问题讨论】:

    标签: python python-2.7 stdout flush rate


    【解决方案1】:

    问题是while 循环末尾的t1 = t2。这会将t1 设置为sleep 延迟之前 的时间,因此下次您测试经过的时间间隔时它将超过1 秒,因此将跳过sleep 调用.

    要修复它,请将最后一行更改为

    t1 = time.time()
    

    顺便说一句,使用新的time.perf_counter() 可能比使用 time.time() 更准确

    【讨论】:

    • 呸,我真笨。谢谢。
    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2014-12-03
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多