输出标准输入的每第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个字节进行采样。

+0

只需读取系统上的3GB文件需要多长时间? (确保它不在磁盘缓存中) – NPE 2014-11-08 23:03:32

+0

读取整个文件很慢,但我对n很大的情况感兴趣。例如,我想从二进制文件中抽取500个字节。 – tba 2014-11-08 23:12:06

+0

这并不一定会增加太多。例如,读取磁盘上的每个第500个字节的文件很可能与读取整个文件一样慢。 – NPE 2014-11-08 23:19:30

注意:OP改变从100到100000000的示例中,n有效地使我的代码慢于他的,一般情况下我只是删除我的回答,因为它不再是比原来的例子更好,但我的回答得到了一票所以我会保持原样。


,我能想到的,使其更快的唯一途径是阅读一切在一次和使用切片

#!/usr/bin/env python 
import sys 
n = int(sys.argv[1]) 
data = sys.stdin.read() 
print(data[::n]) 

虽然,要满足一个3GB的文件到RAM可能是一个非常坏主意

+1

你认为这会比原来更快的原因是什么? – NPE 2014-11-08 23:17:51

+0

你不会调用读取和检查每个循环是否不是块 – 2014-11-08 23:19:43

+0

这只会有助于如果这是瓶颈,并且几乎可以肯定是其他地方(磁盘I/O)。 – NPE 2014-11-08 23:21:39