Python 嵌套循环与计算与线性过程

Python 嵌套循环与计算与线性过程,python,performance,for-loop,Python,Performance,For Loop,我正在迭代m个数据帧,每个数据帧包含一个包含N个URL的列。对于每个URL,我提取段落文本,然后在计算“情绪”分数之前对文本分析进行标准清理 对我来说,这样做是否更有效率: 按原样继续(为循环本身计算URL中的分数) 首先从URL中提取所有文本,然后分别迭代文本列表/列 还是没有什么区别 当前正在循环本身中运行计算。每个DF有大约15000-20000个URL,所以它也花费了大量的时间 #DFs存储在网站上 #我提取每个.csv文件的链接,并将其作为列表存储在“df_links”中 对于df_链

我正在迭代m个数据帧,每个数据帧包含一个包含N个URL的列。对于每个URL,我提取段落文本,然后在计算“情绪”分数之前对文本分析进行标准清理

对我来说,这样做是否更有效率:

  • 按原样继续(为循环本身计算URL中的分数)

  • 首先从URL中提取所有文本,然后分别迭代文本列表/列

  • 还是没有什么区别

    当前正在循环本身中运行计算。每个DF有大约15000-20000个URL,所以它也花费了大量的时间

    #DFs存储在网站上
    #我提取每个.csv文件的链接,并将其作为列表存储在“df_links”中
    对于df_链接中的链接:
    清洁物品=[]
    df=pd.read\u csv(链接,sep=“\t”,标题=None)
    #进行df清洁
    #要刮取的文章的URL存储在1列中,我将其迭代为。。。
    对于df['article_url']中的url:
    response=requests.get(url)
    soup=BeautifulSoup(response.text'html.parser')
    para_text=[text.get_text()表示soup.findAll('p')中的文本]
    text=“”.连接(段落文本)
    words=text.split()
    如果len(字)>500:
    #进行文本清理和分数计算
    #已清除文本存储为变量“clean_text”
    已清除的文章。附加(清除的文本)
    df['article_text']=已清理的文章
    df.to_csv('file_name.csv'))
    
    提取所有文本,然后处理所有文本,或者提取一个文本,然后在提取下一个文本之前处理它,两者没有任何区别。 做ABABAB和做aaabb花费的时间一样多。
    不过,您可能对并行使用或获取所有数据感兴趣。

    要回答这个问题,下载数据并对其进行分析应该不会有太大的影响。你只需要重新安排你完成一系列任务的顺序,这些任务实际上需要相同的时间

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

    请允许我大胆地将您的问题重新解释为:“我的分析耗时太长,请帮助我加快速度!”

    这听起来像是一个完美的多处理用例!由于这听起来像是一个数据科学项目,如果您使用的是ipython笔记本(如Jupyter),则需要
    pip安装多进程
    ;如果使用的是python脚本,则需要
    import多进程
    。这是因为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_CPU*2的一个因素

    也许你应该投票并接受你之前问题的答案。否则,任何人都不太可能在回答问题时花费相应的时间。哇。这听起来正是我需要的——非常感谢,伊登!Re:“请允许我大胆地将您的问题重新解释为:“我的分析耗时太长,请帮助我加快速度!”!“哈哈!这真是太棒了,而且绝对准确。我将阅读多进程,然后实现。非常感谢!:-)