首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中读取文件: slurp还是filter?

在Python中读取文件: slurp还是filter?
EN

Stack Overflow用户
提问于 2016-04-24 05:08:37
回答 1查看 319关注 0票数 1

我想要比较将流作为过滤器处理的效果(即,get _ bit、process、rinse)和slurping (即,获取所有信息,然后处理)的效果。

然而,当我运行下面的两个代码时,我得到了类似的结果。我希望在slurp版本中得到一个更糟糕的结果。

下面的代码片段是否与上面描述的有所不同?如果它们是等价的,我如何调整它们中的一个来测试滤波器/吸音的差异?

我用以下命令测试脚本:

代码语言:javascript
复制
jot 100000000 | time python3 dont_slurp.py > /dev/null
jot 100000000 | time python3 slurp.py > /dev/null

Jot生成从1到x的数字,代码片段只表示行的数字。

过滤器:

代码语言:javascript
复制
import sys
lineno = 0
for line in sys.stdin:
    lineno += 1
    print("{:>6} {}".format(lineno, line[:-1]))

嗡嗡声:

代码语言:javascript
复制
import sys

f = sys.stdin
lineno = 0

for line in f:
    lineno += 1
    print('{:>6} {}'.format(lineno, line[:-1]))
EN

回答 1

Stack Overflow用户

发布于 2016-04-24 05:40:29

首先,你的代码样本并不是你想的那样。f = sys.stdin所要做的就是将f设置为相同的文件句柄。行for line in f:for line in sys.stdin:在功能上是相同的。

你想要的是:

代码语言:javascript
复制
 import sys

 lineno = 0

 for line in sys.stdin.readlines():
      lineno += 1
      print('{:>6} {}'.format(lineno, line[:-1]))

readlines()返回一个列表,文件中每行一个元素。我相信它不是一个生成器,所以你可以得到完整的列表。文件句柄本身充当生成器,一次给您一行。

您应该会看到与readline()的性能差异。

然而,答案是“哪一个更好?”是“视情况而定”。当您逐行读取时,您正在进行系统调用,这反过来会导致操作系统以块为单位读取磁盘中的文件内容。这些块可能大于平均行的大小,并且块可能被缓存。这意味着有时你会访问磁盘,花费很多时间,而另一些时候,你会访问缓存,花费很少的时间。

当您一次读取所有内容时,您可以一次将文件中的每个字节加载到内存中。如果您有足够的空闲内存来保存所有文件内容,则这与逐行版本所需的时间完全相同。在这两种情况下,它基本上只是顺序读取整个文件所需的时间,并具有一些开销。

不同之处在于没有足够的空闲内存来容纳整个文件。在这种情况下,您读取了整个文件,但部分文件被虚拟内存系统交换回磁盘。然后,当您访问该特定行时,它们必须再次被拉入。

具体损失了多少时间取决于使用了多少内存,系统上正在进行多少其他活动,等等,因此通常无法量化。

在这种情况下,除非出现问题,否则你不应该担心它。在代码中做更自然的事情,只有在你的程序太慢的时候才会担心性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36820173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档