[英]Nested For Loops With Calculations Vs. Linear Process
我正在迭代 M 个数据帧,每个数据帧都包含一个带有 N 个 URL 的列。 对于每个 URL,我提取段落文本,然后在计算“情绪”分数之前进行文本分析的标准清理。
对我来说是否更有效:
继续原样(在 URL for 循环本身中计算分数)
首先从 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 倍!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.