Вложено для циклов с вычислениямиЛинейный процесс - PullRequest
2 голосов
/ 21 июня 2019

Я перебираю M фреймов данных, каждый из которых содержит столбец с N URL. Для каждого URL я извлекаю текст абзаца, а затем выполняю стандартную очистку для текстового анализа, прежде чем вычислять оценки "настроений".

Это более эффективно для меня:

  1. Продолжить, как есть (вычислить оценки в самом цикле URL for)

  2. Извлечь сначала весь текст из URL, а затем отдельно перебрать список / столбец текста?

Или это ничего не меняет?

В настоящее время выполняются вычисления внутри самого цикла. Каждый DF имеет около 15 000 - 20 000 URL-адресов, так что это тоже требует безумного времени!

# DFs are stored on a website
# I extract links to each .csv file and store it as a list in "df_links"

for link in df_links:
    cleaned_articles = []
    df = pd.read_csv(link, sep="\t", header=None)
    # Conduct df cleaning
    # URLs for articles to scrape are stored in 1 column, which I iterate over as...
    for url in df['article_url']:
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        para_text = [text.get_text() for text in soup.findAll('p')]
        text = " ".join(para_text)
        words = text.split()

        if len(words) > 500:
            # Conduct Text Cleaning & Scores Computations
            # Cleaned text stored as a variable "clean_text"
            cleaned_articles.append(clean_text)

    df['article_text'] = cleaned_articles
    df.to_csv('file_name.csv')

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Чтобы ответить на вопрос, это не должно иметь большого значения, если вы загрузите данные, а затем примените к ним анализ.Вы просто изменили бы порядок, в котором вы выполняете набор задач, которые фактически занимают одно и то же время.

Единственная разница может заключаться в том, что текстовый корпус достаточно велик, а затем время записи при чтении на диск начнет играть роль, что может немного ускорить запуск аналитики в памяти.Но это все равно не решит твою проблему.

Могу ли я быть настолько смелым, чтобы переосмыслить ваш вопрос следующим образом: «Мой анализ занимает слишком много времени, помогите мне ускорить его!»

Это звучит как идеальный вариант использования для многопроцессорной обработки!Поскольку это звучит как проект по науке о данных, вам нужно pip install multiprocess, если вы используете ноутбук ipython (например, Jupyter) или import multiprocessing, если вы используете скрипт на python.Это происходит из-за того, как python передает информацию между процессами, не беспокойтесь, хотя API как для многопроцессорных, так и для многопроцессорных систем идентичны!

Основной и простой способ ускорить ваш анализ - сделать отступ forцикл и поместите его в функцию.Затем эта функция может быть передана в многопроцессорную карту, которая может порождать несколько процессов и выполнять анализ по нескольким URL-адресам одновременно:

from multiprocess import Pool
import numpy as np
import os
import pandas as pd
num_cpus = os.cpu_count()

def analytics_function(*args):
#Your full function including fetching data goes here and accepts a array of links
return something

df_links_split = np.array_split(df_links, num_cpus * 2) #I normally just use 2 as a rule of thumb
pool = Pool(num_cpus * 2) #Start a pool with num_cpus * 2 processes
list_of_returned = pool.map(analytics_function, df_links_split)

Это ускорит загрузку процессов и задействует весь ваш процессор.Вы не сможете больше ничего делать на своем компьютере, и вам нужно будет открыть монитор ресурсов, чтобы убедиться, что вы не расходуете больше памяти и не замедляете / не прекращаете процесс.Но это должно значительно ускорить ваш анализ примерно в num_cpus * 2 !!

0 голосов
/ 21 июня 2019

Извлечение всех текстов с последующей их обработкой или извлечение одного текста с последующей обработкой перед извлечением следующего не будет иметь никакого значения.Работа над ABABAB занимает столько же времени, сколько и работа над AAABBB.Тем не менее, вас может заинтересовать использование потоков или асинхронных запросов для параллельного извлечения всех данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...