【问题标题】:slow for i loop in pythonpython中的i循环慢
【发布时间】:2021-11-13 11:54:52
【问题描述】:

我在优化 for i 循环时遇到问题,该循环使用的时间序列数据基于前一个结果的下一个结果。

import pandas as pd
import numpy as np
df= pd.Series(range(1,1000000))
df=df.to_frame(name="CusUnits")
df['UpperBoundary'] = 10
df['LowerBoundary'] = -10
from progress.bar import Bar
import time
from tqdm import tqdm
from time import sleep
length=len(df)
df.loc[0, 'Hedged'] = df.loc[0, 'CusUnits']

for i in tqdm(range(1, length)):
    if (df.loc[i, 'UpperBoundary'] > (df.loc[i-1, 'Hedged'] - df.loc[i, 'CusUnits']) > df.loc[i, 'LowerBoundary']):  df.loc[i, 'Hedged'] = df.loc[i-1, 'Hedged']     
    else :df.loc[i, 'Hedged'] =df.loc[i-1, 'CusUnits']

【问题讨论】:

  • pass 在 for 循环中做了什么?
  • 可以分享一个可重现的小例子吗?
  • 您可以将 if/elif 行替换为 if (dataframe.loc[i, 'UpperUnits'] < (dataframe.loc[i-1, 'Hedged'] - dataframe.loc[i, 'CusUnits']) < dataframe.loc[i, 'LowerUnits']: dataframe.loc[i, 'Hedged'] = dataframe.loc[i, 'CusUnits'] 并更好地在变量中分配 len(dataframe) 值,而不是在每个循环中调用它
  • 删除重复。如果您复制并粘贴了任何内容,请将其替换为变量。
  • 编辑问题。让它很棒。请参阅How to Ask 以及如何创建minimal reproducible example

标签: python performance loops for-loop


【解决方案1】:

for i in tqdm(range(1, length)):
    if (df.at[i, 'UpperBoundary'] > (df.at[i-1, 'Hedged'] - df.at[i, 'CusUnits']) > df.at[i, 'LowerBoundary']):  df.at[i, 'Hedged'] = df.at[i-1, 'Hedged']     
    else :df.at[i, 'Hedged'] =df.at[i-1, 'CusUnits']

the replacement of loc with at solved many thanks for you comments

【讨论】:

    猜你喜欢
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2023-03-14
    • 2016-05-16
    • 1970-01-01
    • 2015-07-05
    相关资源
    最近更新 更多