Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每N字节标准输入输出一次_Python_Unix_Io - Fatal编程技术网

Python 每N字节标准输入输出一次

Python 每N字节标准输入输出一次,python,unix,io,Python,Unix,Io,从stdin读取并每N个字节输出一次,最简单有效的方法是什么? 我想要一个在OSX上工作的命令行实用程序,并且更愿意避免 此Python脚本相当慢(n=100000000时,3GB文件的速度为25秒): 不幸的是,我们不能使用sys.stdin.seek来避免读取整个文件 编辑:我想针对n是文件大小的重要部分的情况进行优化。例如,我经常使用此实用程序从一个大文件中的等距位置采样500字节。注意:OP将示例n从100更改为100000000,这有效地使我的代码比他的代码慢,通常我只会删除我的答案,

从stdin读取并每N个字节输出一次,最简单有效的方法是什么? 我想要一个在OSX上工作的命令行实用程序,并且更愿意避免

此Python脚本相当慢(n=100000000时,3GB文件的速度为25秒):

不幸的是,我们不能使用
sys.stdin.seek
来避免读取整个文件


编辑:我想针对n是文件大小的重要部分的情况进行优化。例如,我经常使用此实用程序从一个大文件中的等距位置采样500字节。

注意:OP将示例n从100更改为100000000,这有效地使我的代码比他的代码慢,通常我只会删除我的答案,因为它不再比原始示例好,但我的答案得到了投票,所以我将保持原样


我能想到的使它更快的唯一方法是立即读取所有内容并使用slice

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

尽管如此,尝试将3GB文件装入ram可能是一个非常糟糕的主意

在系统上读取3GB文件需要多长时间?(请确保此时它不在磁盘缓存中。)读取整个文件的速度很慢,但我对n较大的情况感兴趣。例如,我想从一个二进制文件中抽取500个字节,这不一定会增加很多。例如,在磁盘上读取文件的每500个字节可能与读取整个文件一样慢。我在SSD上,所以希望我能做得更好。请注意,我只想在等距位置读取500个字节,而不是每500个字节读取一次。文件必须通过stdin传送吗?你能直接访问它吗?你有什么理由认为这会比原来的更快?你不会在每个循环上调用read和checking,如果不是chunk的话。只有在瓶颈所在的地方,而且几乎肯定在其他地方(磁盘I/O),这才有帮助。在我的4.9MB测试用例中,它快了42倍,在我的49.7MB测试用例中,它快了129倍,我尝试这样做的原因是因为我注意到在原始代码中,我的cpu最大输出(100%),尽管我通过了第n个5,所以它在原始代码中每5个字节读取一次。不幸的是,在n=100000000的3GB文件中,这是较慢的(对于我来说,这是一个更现实的价值)。
#!/usr/bin/env python
import sys
n = int(sys.argv[1])
data = sys.stdin.read()
print(data[::n])