urllib.urlretrieve与urllib.urlopen的速度

时间:2013-11-21 00:30:28

标签: python urllib

我正试图直接从SEC ftp服务器下载SEC文件。当我使用urllib.urlretrieve(url,dst)时,花费的时间比page = urllib.urlopen(url).read()后跟writeFile.write(page)的时间要长得多。举个例子:

from time import time
import urllib
url = 'ftp://ftp.sec.gov/edgar/data/886475/0001019056-13-000804.txt'

t0 = time()
urllib.urlretrieve(url,'D:/temp.txt')
t1 = time()
t = t1-t0
print "urllib.urlretrieve time = %s" % t


t0 = time()
writefile = open('D:/temp2.txt','w')
page = urllib.urlopen(url).read()
writefile.write(page)
writefile.close()
t1 = time()
t = t1-t0
print "urllib.urlopen time = %s" % t

当我运行它时,urllib.urlretrieve得到33秒,urllib.urlopen块得到2.6秒。如果我观看D驱动器,则可以非常快速地下载完整的~5.6MB,但它会挂起~30秒。这里发生了什么?我可以使用urllib.urlopen方法继续我的项目,但是想知道将来的项目。我正在运行Windows 7专业版64位,这是Python 2.7。在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

时机是一件有趣的事情,特别是考虑到网络的无状态环境。

虽然我没有吸烟枪,但我建议你看看source for urllib(截至2.7)。

您可以在第69行看到:def urlopen和第87行:def urlretrieve。两者都创建FancyURLopener(),但在类中调用单独的函数。

我最好的猜测是延迟围绕着:

  1. Windows文件处理程序,打开,关闭等
  2. DNS解析(不太可能,因为文件会在您声明的情况下解析并下载5.6秒。
  3. 你总是可以破解你的urllib.py来源打印每个子功能调用的时间,即使只是暂时跟踪挂断。要找到安装存储urllib.py的位置,请使用以下命令:

    import urllib
    print urllib.__file__