我想要比较将流作为过滤器处理的效果(即,get _ bit、process、rinse)和slurping (即,获取所有信息,然后处理)的效果。
然而,当我运行下面的两个代码时,我得到了类似的结果。我希望在slurp版本中得到一个更糟糕的结果。
下面的代码片段是否与上面描述的有所不同?如果它们是等价的,我如何调整它们中的一个来测试滤波器/吸音的差异?
我用以下命令测试脚本:
jot 100000000 | time python3 dont_slurp.py > /dev/null
jot 100000000 | time python3 slurp.py > /dev/nullJot生成从1到x的数字,代码片段只表示行的数字。
过滤器:
import sys
lineno = 0
for line in sys.stdin:
lineno += 1
print("{:>6} {}".format(lineno, line[:-1]))嗡嗡声:
import sys
f = sys.stdin
lineno = 0
for line in f:
lineno += 1
print('{:>6} {}'.format(lineno, line[:-1]))发布于 2016-04-24 05:40:29
首先,你的代码样本并不是你想的那样。f = sys.stdin所要做的就是将f设置为相同的文件句柄。行for line in f:和for line in sys.stdin:在功能上是相同的。
你想要的是:
import sys
lineno = 0
for line in sys.stdin.readlines():
lineno += 1
print('{:>6} {}'.format(lineno, line[:-1]))readlines()返回一个列表,文件中每行一个元素。我相信它不是一个生成器,所以你可以得到完整的列表。文件句柄本身充当生成器,一次给您一行。
您应该会看到与readline()的性能差异。
然而,答案是“哪一个更好?”是“视情况而定”。当您逐行读取时,您正在进行系统调用,这反过来会导致操作系统以块为单位读取磁盘中的文件内容。这些块可能大于平均行的大小,并且块可能被缓存。这意味着有时你会访问磁盘,花费很多时间,而另一些时候,你会访问缓存,花费很少的时间。
当您一次读取所有内容时,您可以一次将文件中的每个字节加载到内存中。如果您有足够的空闲内存来保存所有文件内容,则这与逐行版本所需的时间完全相同。在这两种情况下,它基本上只是顺序读取整个文件所需的时间,并具有一些开销。
不同之处在于没有足够的空闲内存来容纳整个文件。在这种情况下,您读取了整个文件,但部分文件被虚拟内存系统交换回磁盘。然后,当您访问该特定行时,它们必须再次被拉入。
具体损失了多少时间取决于使用了多少内存,系统上正在进行多少其他活动,等等,因此通常无法量化。
在这种情况下,除非出现问题,否则你不应该担心它。在代码中做更自然的事情,只有在你的程序太慢的时候才会担心性能。
https://stackoverflow.com/questions/36820173
复制相似问题