Python: stdout 率是它应该的两倍
Python: stdout rate is double of what it should be
我在 python 2.7 中编写了一个名为 slowcat.py 的非常简单的脚本,它允许我以每秒特定的字节速率 cat 一个文件。现在的问题是给出的速率在输出流上加倍了。因此,rate=1 字节导致每秒 2 个字节,而 rate=4 字节导致每秒 8 个字节。实际程序见代码片段:
#!/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()
现在我的问题是:为什么输出速率是我在命令行上传递的速率的两倍?如果您复制粘贴代码片段,您可以轻松地在你的系统例如python slowcat.py --rate 2 slowcat.py
问题出在 while
循环末尾的 t1 = t2
。这将 t1
设置为 之前 的时间 sleep
延迟,因此下次您测试经过的时间间隔时,它将超过 1 秒,因此sleep
呼叫将被跳过。
要修复它,请将最后一行更改为
t1 = time.time()
顺便说一句,使用新的 time.perf_counter() 可能比 time.time()
更准确
我在 python 2.7 中编写了一个名为 slowcat.py 的非常简单的脚本,它允许我以每秒特定的字节速率 cat 一个文件。现在的问题是给出的速率在输出流上加倍了。因此,rate=1 字节导致每秒 2 个字节,而 rate=4 字节导致每秒 8 个字节。实际程序见代码片段:
#!/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()
现在我的问题是:为什么输出速率是我在命令行上传递的速率的两倍?如果您复制粘贴代码片段,您可以轻松地在你的系统例如python slowcat.py --rate 2 slowcat.py
问题出在 while
循环末尾的 t1 = t2
。这将 t1
设置为 之前 的时间 sleep
延迟,因此下次您测试经过的时间间隔时,它将超过 1 秒,因此sleep
呼叫将被跳过。
要修复它,请将最后一行更改为
t1 = time.time()
顺便说一句,使用新的 time.perf_counter() 可能比 time.time()
更准确