urllib.urlopen()如何工作?

时间:2011-08-26 05:11:56

标签: python performance file urllib urlopen

让我们考虑一个大文件(~100MB)。让我们考虑该文件是基于行的(文本文件,相对较短的行~80个字符)。 如果我使用内置open() / file(),则该文件将加载到lazy manner中。 I.E.如果我做aFile.readline()只有一个文件块将驻留在内存中。 urllib.urlopen()是否做了类似的事情(在磁盘上使用缓存)?

urllib.urlopen().readline()file().readline()之间的效果差异有多大?我们假设该文件位于localhost上。我用urllib.urlopen()然后用file()打开它。当我用readline()循环文件时,性能/内存消耗会有多大差异?

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

  

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

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

  

urllib.urlopen().readline()file().readline()之间的效果差异有多大?

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

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

  

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

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

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