2

让我们考虑一个大文件(~100MB)。让我们考虑该文件是基于行的(一个文本文件,行相对较短~80 个字符)。如果我使用内置open()/file()文件将以惰性方式加载。IE 如果我aFile.readline()只做一个文件的一部分将驻留在内存中。urllib.urlopen() 是否做类似的事情(使用磁盘上的缓存)?

urllib.urlopen().readline()和之间的性能差异有多大file().readline()?让我们考虑该文件位于本地主机上。一旦我打开它,urllib.urlopen()然后用file(). 当我用 循环文件时,性能/内存消耗的差异有多大readline()

处理通过打开的文件的最佳方法是什么urllib.urlopen()?逐行处理是否更快?或者我应该将一堆行(〜50)加载到一个列表中然后处理该列表?

4

2 回答 2

2

open(或file)并且urllib.urlopen看起来他们或多或少地在那里做同样的事情。urllib.urlopen是(基本上)创建一个socket._socketobject然后调用该makefile方法(该方法的内容包括在下面)

def makefile(self, mode='r', bufsize=-1):
    """makefile([mode[, bufsize]]) -> file object

    Return a regular file object corresponding to the socket.  The mode
    and bufsize arguments are as for the built-in open() function."""
    return _fileobject(self._sock, mode, bufsize)
于 2011-08-26T05:48:23.100 回答
1

urllib.urlopen() 是否做类似的事情(使用磁盘上的缓存)?

操作系统可以。当您使用网络 API 时urllib,操作系统和网卡将执行低级工作,将数据拆分为通过网络发送的小数据包,并接收传入的数据包。这些存储在缓存中,因此应用程序可以抽象出数据包概念并假装它会发送和接收连续的数据流。

urllib.urlopen().readline()和之间的性能差异有多大file().readline()

很难将这两者进行比较。对于urllib,这取决于网络的速度,以及服务器的速度。即使对于本地服务器,也存在一些抽象开销,因此通常从网络 API 读取比直接从文件读取要慢。

对于实际的性能比较,您必须编写一个测试脚本并进行测量。但是,你为什么还要打扰?你不能用另一个替换一个,因为它们有不同的用途。

处理通过打开的文件的最佳方法是什么urllib.urlopen()?逐行处理是否更快?或者我应该将一堆行(〜50)加载到一个列表中然后处理该列表?

由于瓶颈是网络速度,因此在获得数据后立即处理可能是个好主意。这样,操作系统可以“在后台”缓存更多的传入数据。

在处理它们之前将行缓存在列表中是没有意义的。您的程序将坐在那里等待足够的数据到达,而它可能已经在做一些有用的事情。

于 2011-08-26T05:35:12.907 回答