不要调用
Dataframe.append或
pd.concat一个for循环中。这导致二次复制。
pd.concat返回一个新的
Dataframe。必须为新的
Dataframe分配空间,并且必须将旧Dataframe中的数据复制到新的Dataframe中。考虑以下行中所需的复制数量
for-loop(假设每个副本的x大小为1):
super_x = pd.concat([super_x, x], axis=0)| iteration | size of old super_x | size of x | copying required || 0 | 0 | 1 | 1 || 1 | 1 | 1 | 2 || 2 | 2 | 1 | 3 || ... | || || N-1 | N-1 | 1 | N |
1 + 2 + 3 + ... + N = N(N+1)/2。因此,
O(N**2)需要一些副本才能完成循环。
现在考虑
super_x = []for i, df_chunk in enumerate(df_list): [x, y] = preprocess_data(df_chunk) super_x.append(x)super_x = pd.concat(super_x, axis=0)
追加到列表是一项O(1) *** 作,不需要复制。pd.concat循环完成后,现在只有一个调用。pd.concat由于super_x包含N 大小为1的Dataframe,因此对N的调用 需要进行N个拷贝。因此,以这种方式构造时,super_x需要O(N) 拷贝。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)