请帮忙!需要显著提高python for循环的效率

请帮忙!需要显著提高python for循环的效率,python,pandas,numpy,Python,Pandas,Numpy,希望任何人都能帮我,因为我不知道什么更好。 我构建了这个for循环,我需要将股票走势和触发它们的顺序联系起来。 订单和库存的数据集都是巨大的(>2.000.000行),我为循环构建了这个数据集,这个数据集运行得很好,但速度很慢:根据我的数学计算,需要74天才能完成。 我需要你们和你们的魔术师眼睛来看看,告诉我我可以做些什么来提高这个循环的效率,因为我确信我犯了很多新手的错误 编辑:堆栈溢出让我集中精力回答问题,对不起,伙计们。我想我这里的问题是,我在循环中使用了很多pd.DataFrames,因

希望任何人都能帮我,因为我不知道什么更好。 我构建了这个for循环,我需要将股票走势和触发它们的顺序联系起来。 订单和库存的数据集都是巨大的(>2.000.000行),我为循环构建了这个数据集,这个数据集运行得很好,但速度很慢:根据我的数学计算,需要74天才能完成。 我需要你们和你们的魔术师眼睛来看看,告诉我我可以做些什么来提高这个循环的效率,因为我确信我犯了很多新手的错误

编辑:堆栈溢出让我集中精力回答问题,对不起,伙计们。我想我这里的问题是,我在循环中使用了很多pd.DataFrames,因为这是我发现的唯一方法,可以使它与我正在使用的datetime操作一起工作,并将行提取到结果dataframe“inserts”。 我认为如果我改用数组,它会变得更好,我只是不知道如何构建它,甚至不知道如何使它工作,因为我遇到了所有的数据类型错误。 请看一下代码中的数据帧操作,并告诉我您是否发现了使此运行如此缓慢的任何奇怪错误

    for index, row in FOLredux.iterrows():

    # leave stockmov update to another processing step, so this can go faster

    newrow = []
    rollingDF = []

    if row['HadNoStock'] == 'Yes':

        stepdate = row['CheckStockDate']

    else:

        stepdate = row['DecidePackagingDate']


    insertedMovList = inserts['MovementDate'][(inserts['SiteID'] == row['SiteId']) & (inserts['ProductID'] == row['ProductId'])
                                        & (inserts['SizeValue'] == row['SizeValue'])]


    rollingDF = pd.DataFrame({'MovementDate':[StockMov['MovementDate'][(StockMov['siteid'] == row['SiteId']) & (StockMov['ProductID'] == row['ProductId'])
                                        & (StockMov['SizeValue'] == row['SizeValue']) & (StockMov['Delta'] == row['QtySold']*-1) 
                                        ]][0]})

    rollingDF['TotalTime'] = (stepdate - rollingDF['MovementDate']).dt.total_seconds()


    stockdate = pd.DataFrame({'MovementDate': [rollingDF['MovementDate'][(rollingDF['TotalTime'] >= -10)  & (rollingDF['TotalTime'] <= 10)]][0]})

    if len(stockdate) != 0:

        stockdate = stockdate['MovementDate'][~stockdate['MovementDate'].isin(insertedMovList)]



    if len(stockdate) == 0:

        #use creation date

        stepdate = row['BoutiqueOrderDate']

        insertedMovList = inserts['MovementDate'][(inserts['SiteID'] == row['SiteId']) & (inserts['ProductID'] == row['ProductId'])
                                        & (inserts['SizeValue'] == row['SizeValue'])]


        rollingDF = pd.DataFrame({'MovementDate':[StockMov['MovementDate'][(StockMov['siteid'] == row['SiteId']) & (StockMov['ProductID'] == row['ProductId'])
                                        & (StockMov['SizeValue'] == row['SizeValue']) & (StockMov['Delta'] == row['QtySold']*-1) 
                                        ]][0]})

        rollingDF['TotalTime'] = (rollingDF['MovementDate'] - stepdate).dt.total_seconds()/60

        stockdate = pd.DataFrame({'MovementDate': [rollingDF['MovementDate'][(rollingDF['TotalTime'] >= 0)  & (rollingDF['TotalTime'] <= 60)]][0]})

        if len(stockdate) != 0:

            stockdate = stockdate['MovementDate'][~stockdate['MovementDate'].isin(insertedMovList)]


            if len(stockdate) != 0:

                stockdate = min(stockdate)

                orderid = row['OrderCodeId']

                values = [orderid, stockdate, row['SiteId'], row['ProductId'], row['SizeValue'], 1, 0]

                zipped = zip(columns, values)

                data = dict(zipped)

                newrow.append(data)

                inserts = inserts.append(newrow, True)

    else:

        stockdate = min(stockdate)

        orderid = row['OrderCodeId']

        values = [orderid, stockdate, row['SiteId'], row['ProductId'], row['SizeValue'], 0, 0]

        zipped = zip(columns, values)

        data = dict(zipped)

        newrow.append(data)

        inserts = inserts.append(newrow, True)
对于folderdux.iterrows()中的索引行:
#将stockmov更新留给另一个处理步骤,这样可以更快地进行
newrow=[]
rollingDF=[]
如果行['HadNoStock']='Yes':
stepdate=行['CheckStockDate']
其他:
stepdate=行['DecidePackagingDate']
insertedMovList=插入['MovementDate'][(插入['SiteID']==行['SiteID'])和(插入['ProductID']==行['ProductID']))
&(插入['SizeValue']==行['SizeValue']]
rollingDF=pd.DataFrame({'MovementDate':[StockMov['MovementDate'][(StockMov['siteid']==行['siteid'])和(StockMov['ProductID']==行['ProductID']))
&(StockMov['SizeValue']==行['SizeValue'])和(StockMov['Delta']==行['QtySold']*-1)
]][0]})
rollingDF['TotalTime']=(stepdate-rollingDF['MovementDate']).dt.total_seconds()

stockdate=pd.DataFrame({'MovementDate':[rollingDF['MovementDate'][(rollingDF['TotalTime']>=-10)&(rollingDF['TotalTime']=0)&(rollingDF['TotalTime']注意:我对Python比较陌生,所以不要期望我的问题质量最高

我在底部没有看到循环函数。您可以将代码放在def code()下:例如:def main():然后在底部添加:main()。

def main():
    # Code goes here
main()
底部的main()再次运行def main():下的代码。如果要导入库,请确保它位于代码顶部,而不是def main():