嵌套用于计算为Vs的循环。线性过程

时间:2019-06-21 14:01:31

标签: python performance for-loop

我正在遍历M个数据帧,每个数据帧包含一个具有N个URL的列。对于每个URL,我提取段落文本,然后在计算“情感”分数之前进行标准的清理以进行文本分析。

对我来说更有效吗?

  1. 按原样继续(URL循环本身计算分数)

  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 个答案:

答案 0 :(得分:1)

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

唯一的区别可能是文本语料库很大,然后对磁盘的读写时间将开始发挥作用,因此可以更快地在内存中运行所有分析。但这仍然无法真正解决您的问题。

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

这听起来像是多处理的完美用例!由于这听起来像是一个数据科学项目,所以如果您使用的是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 !!

答案 1 :(得分:0)

提取所有文本,然后处理所有文本,或者提取一个文本,然后在提取下一个文本之前对其进行处理,不会有任何区别。 进行ABABAB花费的时间与AAABBB一样。 但是,您可能对使用threadsasynchronous requests并行获取所有数据感兴趣。