Как я могу оптимизировать этот цикл for-with? - PullRequest
0 голосов
/ 17 сентября 2018

Я написал скрипт для загрузки файлов PDF из Википедии.Я реализовал цикл для просмотра всех URL-адресов, которые я хочу загрузить (у меня они есть в файле .csv).Первые несколько файлов загружаются довольно быстро (неудивительно, что они имеют размер около 200 КБ), но через некоторое время загрузка занимает все больше и больше времени.Это похоже на некоторый экспоненциальный рост в моем цикле, который делает цикл намного медленнее после каждой итерации.Может быть, запрос не был закрыт правильно или что-то, я действительно не знаю.

Может кто-нибудь помочь мне сделать этот код менее плохим и более эффективным?urls и titles оба являются списками.Они передаются из одной и той же функции, поэтому я мог бы просто преобразовать их в словарь.

    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 минуты для следующих запросов. Это будет означать, что вопрос связан не с «загрузкой больших файлов», а с вопросом «как загрузить множество очень маленьких файлов?».

Наверное, вопрос сейчасдолжно быть: Кто-нибудь знает, сколько задержки нужно добавить, чтобы исправить это? И согласны ли вы со мной, что «задержка» должна быть вызвана отправкой слишком большого количества запросов за слишком короткое время?

1 Ответ

0 голосов
/ 17 сентября 2018

Предложения в комментариях хороши, если вы столкнулись с большим PDF-файлом. Вы можете получить более быстрый результат даже с небольшими файлами, если ваша загрузка выполняется асинхронно с scrapy

Что касается эстетики кода, вы можете назначить каждую отдельную ответственность отдельной функции, например:

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)

Надеюсь, это поможет.

...