繁体   English   中英

嵌套 For 循环与计算 Vs。 线性过程

[英]Nested For Loops With Calculations Vs. Linear Process

我正在迭代 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')

要回答这个问题,如果您下载数据然后对其进行分析,应该不会有太大区别。 您只需重新安排执行一组有效花费相同时间的任务的顺序。

唯一的区别可能是,如果文本语料库相当大,然后对磁盘的读写时间将开始发挥作用,因此在内存中运行分析可能会更快一些。 但这仍然不能真正解决您的问题。

我可以大胆地将您的问题重新解释为:“我的分析花费的时间太长,帮助我加快速度!”

这听起来像是多处理的完美用例! 由于这听起来像是一个数据科学项目,如果您使用 ipython 笔记本(如 Jupyter),则需要pip install multiprocess或如果使用 python 脚本import multiprocessing 这是因为 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)

这将启动大量进程并充分利用您的 CPU。 您将无法在计算机上做很多其他事情,并且您需要打开资源监视器以检查您没有最大化我们的内存并减慢/崩溃进程。 但它应该会显着加快您的分析速度,大约是 num_cpus * 2 倍!!

提取所有文本然后处理所有文本或提取一个文本然后在提取下一个文本之前处理它不会有任何区别。 做 ABABAB 花费的时间和做 AAABBB 一样多。 但是,您可能对使用线程异步请求并行获取所有数据感兴趣。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM