如何优化for-with循环?

问题描述 投票:0回答:1

我写了一个脚本来从维基百科下载PDF文件。我实现了一个循环来遍历我想要下载的所有URL(我将它们放在.csv文件中)。前几个文件的下载非常快(难怪,它们的大小只有200kB),但过了一段时间,下载需要的时间越来越长。感觉我的循环中有一些指数增长,这使得我在每次迭代后循环变慢。也许请求没有以正确的方式关闭,我真的不知道。

有人可以帮我把这段代码变得更糟糕,更有效吗? urlstitles都是名单。它们从同一个函数传递,所以我可能只是将它们转换成字典。

    def getPDF(urls, titles, path):
    i = 0
    for i in range(len(urls) - 1):
        i += 1
        with open(path + '/{}.pdf'.format(titles[i]), 'wb') as f:
            with requests.session() as s:
                r = s.get(urls[i])
                f.write(r.content)
        print('{}.pdf'.format(titles[i]) + ' downloaded!')

编辑:它必须与请求有关。我添加了一个函数,打印出下载时间(从getPDF()的第一行到print()行。这些是结果:

Downloads werden gestartet, das Programm beendet automatisch...

Wirtschaft.pdf downloaded! (2.606057643890381sec)
Wirtschaftseinheit.pdf downloaded! (1.41001296043396sec)
Planung.pdf downloaded! (1.6632893085479736sec)
Bedürfnis#In den Wirtschaftswissenschaften.pdf downloaded! (1.4947214126586914sec)
Unternehmen.pdf downloaded! (2.317748546600342sec)
Privathaushalt.pdf downloaded! (122.32739114761353sec)
%C3%96ffentlicher Haushalt.pdf downloaded! (2.03417706489563sec)
Absatzwirtschaft.pdf downloaded! (0.8923726081848145sec)
Produktion.pdf downloaded! (0.2800614833831787sec)
Tausch.pdf downloaded! (1.5359272956848145sec)
Konsum.pdf downloaded! (121.9487988948822sec)
Entsorgungswirtschaft.pdf downloaded! (121.20771074295044sec)
Gut (Wirtschaftswissenschaft).pdf downloaded! (245.15847492218018sec)

Fertig!

注意:我把它放在代码中,所以它被格式化,我希望没关系。

很明显,在4个请求之后你会得到类似'罢工'的东西,然后需要等待2分钟,最后你立刻得到中风,甚至不得不等待4分钟才能完成下一个请求。这意味着问题与“下载大文件”无关,而更多的是“如何下载大量非常小的文件?”。

我想现在的问题应该是:有谁知道你需要添加多少延迟来解决这个问题?你是否同意我的看法,“滞后”必须是在太短的时间内发送过多的请求?

python performance loops python-requests fwrite
1个回答
0
投票

如果您遇到大型pdf文件,评论中的建议很好。如果您使用scrapy下载异常,即使使用较小的文件,您也可以获得更快的结果

至于代码aestetics,你可以将每个人的责任放在一个单独的功能上,例如:

def fetch(url):
    with requests.session() as s:
        r = s.get(url)
        return (r.content)

您的主要工作人员功能可以是:

def save_pdf(url, title, directory):
    filename = make_path(title, directory)
    with open(filename, 'wb') as f:
        content = fetch(url) 
        f.write(content)

和主循环控制循环:

for t in targets:
   savePDF(t['url'], t['title'], directory)

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.