从stdin读取并输出每个第n个字节最简单有效的方法是什么? 我想要一个适用于OS X的命令行实用程序,并且宁愿避免使用compiled languages。
这个Python脚本相当慢(当n = 100000000时,3GB文件为25秒):
#!/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 :(得分:1)
注意:OP将示例n从100更改为100000000,这有效地使我的代码比他慢,通常我会删除我的答案,因为它不再比原始示例更好,但我的答案得到了投票,所以我会保持原样。
我能想到让它更快的唯一方法是一次读取所有内容并使用切片
#!/usr/bin/env python
import sys
n = int(sys.argv[1])
data = sys.stdin.read()
print(data[::n])
尽管如此,尝试将3GB文件放入ram可能是一个非常糟糕的主意