WenchengW787 2024-09-10 11:22 采纳率: 50%
浏览 13
已结题

Python for loop减少运行时间

问题遇到的现象和发生背景

你好 我想将以下的代码运行时间缩短。谢谢!

操作环境、软件版本等信息
start_date='2023-08-08'
end_date='2024-09-08'
date_index=pd.date_range(start_date,end_date)
IndustryRotate=pd.DataFrame()
IndustryName=w.wset("sectorconstituent","date="+end_date+";sectorid=a39901011g000000",usedf=True)[1]
IndustryName=IndustryName['wind_code'].tolist()

for i in range(len(date_index)):
    date=date_index[i]-timedelta(days=1)
    date=date.strftime('%Y-%m-%d')
    date2=date_index[i]
    date2=date2.strftime('%Y-%m-%d')
    IndustryNamePct=w.wss(IndustryName, "pct_chg","tradeDate="+date+";cycle=D",usedf=True)[1]
    IndustryNamePct['Rank']=IndustryNamePct['PCT_CHG'].rank()
    IndustryNamePct.dropna(inplace=True)
    if len(IndustryNamePct)==0:
        continue
    IndustryNamePct2=w.wss(IndustryName, "pct_chg","tradeDate="+date2+";cycle=D",usedf=True)[1]
    IndustryNamePct2['Rank2']=IndustryNamePct2['PCT_CHG'].rank()
    IndustryNamePct2.dropna(inplace=True)
    if len(IndustryNamePct2)==0:
        continue
    IndustryNamePctT=pd.concat([IndustryNamePct['Rank'], IndustryNamePct2['Rank2']], axis=1)
    IndustryNamePctT['Diff']=abs(IndustryNamePctT['Rank']-IndustryNamePctT['Rank2'])
    Sum=IndustryNamePctT['Diff'].sum()
    
    IndustryRotate=IndustryRotate.append(pd.DataFrame({'Date':[date_index[i]],'RankSum':[Sum]}),ignore_index=True)

    print(IndustryRotate)
我想要达到的结果

缩短代码运行时间

  • 写回答

21条回答 默认 最新

  • 阿齐Archie 嵌入式领域优质创作者 2024-09-10 11:23
    关注

    以下参考免费微信小程序:皆我百晓生 作答,并由阿齐Archie整理回复,若还有疑问可评论或留言。

    为了减少Python代码的运行时间,我们可以采取几种策略:

    1. 避免在循环中重复调用函数:比如w.wss这样的函数调用可能会很慢,如果可能的话,应该尝试批量获取数据而不是在每次循环中都调用。

    2. 向量化操作:尽可能使用Pandas和NumPy的向量化操作来替代循环,这样可以显著提高性能。

    3. 减少不必要的数据复制:在数据处理过程中,尽量避免不必要的数据复制,因为数据复制会消耗额外的时间和内存。

    4. 使用更高效的数据结构:选择合适的数据结构可以减少运行时间。

    5. 并行处理:如果任务可以并行执行,可以考虑使用并行处理来加速。

    下面是对你的代码的一些建议:

    import pandas as pd
    from datetime import timedelta
    
    # 假设 w 是已经定义好的WindPy对象
    start_date = '2023-08-08'
    end_date = '2024-09-08'
    date_index = pd.date_range(start_date, end_date)
    IndustryName = w.wset("sectorconstituent", "date=" + end_date + ";sectorid=a39901011g000000", usedf=True)[1]
    IndustryName = IndustryName['wind_code'].tolist()
    
    # 预先获取所有需要的数据
    dates = [date_index[i].strftime('%Y-%m-01') for i in range(len(date_index))]  # 假设每月第一天
    pct_changes = {d: w.wss(IndustryName, "pct_chg", "tradeDate=" + d + ";cycle=D", usedf=True)[1] for d in dates}
    pct_changes = {d: df for d, df in pct_changes.items() if not df.empty}
    
    # 计算排名和差异
    IndustryRotate = pd.DataFrame()
    for i, date in enumerate(dates):
        today = pct_changes[date]
        next_day = pct_changes[dates[(i + 1) % len(dates)]] if (i + 1) % len(dates) != 0 else pct_changes[dates[0]]
        
        if today.empty or next_day.empty:
            continue
        
        today['Rank'] = today['PCT_CHG'].rank()
        next_day['Rank2'] = next_day['PCT_CHG'].rank()
        
        combined = pd.concat([today, next_day], axis=1)
        combined.columns = ['Rank', 'Rank2']
        combined['Diff'] = abs(combined['Rank'] - combined['Rank2'])
        Sum = combined['Diff'].sum()
        
        IndustryRotate = IndustryRotate.append(pd.DataFrame({'Date': [date], 'RankSum': [Sum]}), ignore_index=True)
    
    print(IndustryRotate)
    

    这段代码做了以下优化:

    • 批量获取数据:预先获取所有需要的数据,而不是在每次循环中都调用w.wss
    • 向量化操作:使用Pandas的向量化操作来计算排名和差异,而不是使用循环。
    • 减少数据复制:通过直接在原始DataFrame上操作来减少数据复制。

    请注意,这段代码假设w是一个已经定义好的WindPy对象,并且w.wssw.wset是可用的函数。你可能需要根据实际情况调整这些函数调用。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(20条)

报告相同问题?

问题事件

  • 系统已结题 9月19日
  • 已采纳回答 9月11日
  • 创建了问题 9月10日

悬赏问题

  • ¥15 如何构建全国统一的物流管理平台?
  • ¥100 ijkplayer使用AndroidStudio/CMake编译,如何支持 rtsp 直播流?
  • ¥20 和学习数据的传参方式,选择正确的传参方式有关
  • ¥15 这是网络安全里面的poem code
  • ¥15 用js遍历数据并对非空元素添加css样式
  • ¥15 使用autodl云训练,希望有直接运行的代码(关键词-数据集)
  • ¥50 python写segy数据出错
  • ¥20 关于线性结构的问题:希望能从头到尾完整地帮我改一下,困扰我很久了
  • ¥30 3D多模态医疗数据集-视觉问答
  • ¥20 设计一个二极管稳压值检测电路