【问题标题】:Nested For Loops With Calculations Vs. Linear Process带有计算的嵌套 For 循环与。线性过程
【发布时间】:2019-06-21 14:01:31
【问题描述】:

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

【问题讨论】:

  • 也许您应该投票并接受您之前问题的答案。否则,任何人都不太可能在答案中投入相关的时间。

标签: python performance for-loop


【解决方案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 倍!!

【讨论】:

  • 哇。这听起来正是我所需要的——非常感谢,伊甸园!回复:“我可以大胆地将您的问题重新解释为:“我的分析时间太长,帮助我加快速度!”“-哈哈!这太棒了——而且绝对是正确的。我将阅读多进程然后实施。非常感谢! :-)
【解决方案2】:

提取所有文本然后处理所有文本或提取一个文本然后在提取下一个文本之前处理它不会有任何区别。 做 ABABAB 和做 AAABBB 一样多。 但是,您可能对使用 threadsasynchronous requests 并行获取所有数据感兴趣。

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2018-03-19
    相关资源
    最近更新 更多