请帮忙!需要显著提高python for循环的效率
希望任何人都能帮我,因为我不知道什么更好。 我构建了这个for循环,我需要将股票走势和触发它们的顺序联系起来。 订单和库存的数据集都是巨大的(>2.000.000行),我为循环构建了这个数据集,这个数据集运行得很好,但速度很慢:根据我的数学计算,需要74天才能完成。 我需要你们和你们的魔术师眼睛来看看,告诉我我可以做些什么来提高这个循环的效率,因为我确信我犯了很多新手的错误 编辑:堆栈溢出让我集中精力回答问题,对不起,伙计们。我想我这里的问题是,我在循环中使用了很多pd.DataFrames,因为这是我发现的唯一方法,可以使它与我正在使用的datetime操作一起工作,并将行提取到结果dataframe“inserts”。 我认为如果我改用数组,它会变得更好,我只是不知道如何构建它,甚至不知道如何使它工作,因为我遇到了所有的数据类型错误。 请看一下代码中的数据帧操作,并告诉我您是否发现了使此运行如此缓慢的任何奇怪错误请帮忙!需要显著提高python for循环的效率,python,pandas,numpy,Python,Pandas,Numpy,希望任何人都能帮我,因为我不知道什么更好。 我构建了这个for循环,我需要将股票走势和触发它们的顺序联系起来。 订单和库存的数据集都是巨大的(>2.000.000行),我为循环构建了这个数据集,这个数据集运行得很好,但速度很慢:根据我的数学计算,需要74天才能完成。 我需要你们和你们的魔术师眼睛来看看,告诉我我可以做些什么来提高这个循环的效率,因为我确信我犯了很多新手的错误 编辑:堆栈溢出让我集中精力回答问题,对不起,伙计们。我想我这里的问题是,我在循环中使用了很多pd.DataFrames,因
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():下