输出标准输入的每第n个字节
问题描述:
什么是从标准输入读取并输出每第n个字节的最简单有效的方法? 我想要一个在OS X上运行的命令行工具,并且宁愿避免compiled languages。输出标准输入的每第n个字节
这Python脚本是相当慢(25秒为一个3GB的文件,当n = 100000000):
#!/usr/bin/env python
import sys
n = int(sys.argv[1])
while True:
chunk = sys.stdin.read(n)
if not chunk:
break
sys.stdout.write(chunk[0])
不幸的是,我们不能使用sys.stdin.seek
避免读取整个文件。
编辑:我想优化的情况下,当n是文件大小的重要部分。例如,我经常使用此实用程序在大文件中以等间距位置对500个字节进行采样。
答
注意:OP改变从100到100000000的示例中,n有效地使我的代码慢于他的,一般情况下我只是删除我的回答,因为它不再是比原来的例子更好,但我的回答得到了一票所以我会保持原样。
,我能想到的,使其更快的唯一途径是阅读一切在一次和使用切片
#!/usr/bin/env python
import sys
n = int(sys.argv[1])
data = sys.stdin.read()
print(data[::n])
虽然,要满足一个3GB的文件到RAM可能是一个非常坏主意
只需读取系统上的3GB文件需要多长时间? (确保它不在磁盘缓存中) – NPE 2014-11-08 23:03:32
读取整个文件很慢,但我对n很大的情况感兴趣。例如,我想从二进制文件中抽取500个字节。 – tba 2014-11-08 23:12:06
这并不一定会增加太多。例如,读取磁盘上的每个第500个字节的文件很可能与读取整个文件一样慢。 – NPE 2014-11-08 23:19:30