Python优化-关于在大数据的情况下提高Python的执行效率
一、关于数据拼接
1、append和concat
pandas.concat()和pandas.append()通常用来连接DataFrame对象,默认情况下是对两个DataFrame对象进行纵向连接。
pandas.concat(objs, axis=0, join='outer', ignore_index=False,
keys=None, levels=None, names=None,
verify_integrity=False, sort=False, copy=True)
df.append(self, other, ignore_index=False,
verify_integrity=False, sort=None)
但当在for循环中,在数据量小的时候使用pd.concat()或者pd.append(),程序的执行效率不会受到任何影响,但在大量数据的情况下,仅使用pd.concat()或者pd.append()连接dataframe时,发现随着循环的进行,运行速度越来越慢。
比如:
import pandas as pd
data=pd.read_csv("file.csv")
gp=data.groupby(['user_id'])
NewList=[]
NewDataFrame=pd.DataFrame()
for x,y in gp:
NewDataFrame=NewDataFrame.append(y)
因为与python列表中的append和extend方法不同的是,pandas的append方法和concat方法,不会改变原来的对象,而是创建一个新的对象,这样的话会使效率变低而且会占用更多内存。
2、利用list结合DataFrame优化
所以如果你有很多数据需要append,建议先使用列表,然后传给DataFrame。
import pandas as pd
data=pd.read_csv("file.csv")
gp=data.groupby(['user_id'])
NewList=[]
NewDataFrame=pd.DataFrame()
for x,y in gp:
NewList.append(y)
NewDataFrame=NewDataFrame.append(NewList)
二、关于遍历
1、直接遍历
for macid in macids:
data_macid = df[df['mac_id'] == macid ]
采用该种遍历方式,算法的时间复杂度是 n 2 n^{2} n2,在大数据的情况下,最终的遍历时间直接会平方加倍。
2、利用dict优化
通过先采用时间复杂度为 n n n的遍历,按照每个macid将数据写入字典中,然后通过字典时间复杂度为 1 1 1的遍历,遍历字典中的数据,将整个算法的时间复杂度降为 n n n。
mac_dict = {}
for record in df.iterrows():
mac = record["mac_id"]
if mac not in mac_dict:
mac_dict[mac] = []
mac_dict[mac].append(record)
for macid, data in mac_dict.items():
data_macid = pd.DataFrame(data)
采用该种遍历方式,算法的时间复杂度是 n n n,在大数据的情况下,会节省大量的遍历时间。