我已将此报告为关于熊猫问题的问题。同时,我将其发布在这里,以期节省其他人的时间,以防他们遇到类似的问题。
在对需要优化的过程进行性能分析时,我发现将列重命名为IN120可以将性能(执行时间)提高x120。分析表明这与垃圾收集有关(请参阅下文)。
此外,通过避免dropna方法,可以恢复预期的性能。
以下简短示例演示了系数x12:
import pandas as pd
import numpy as np
inplace = True
%%timeit
np.random.seed(0)
r,c = (7,3)
t = np.random.rand(r)
df1 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
indx = np.random.choice(range(r),r/3, replace=False)
t[indx] = np.random.rand(len(indx))
df2 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
df = (df1-df2).dropna()
## inplace rename:
df.rename(columns={col:'d{}'.format(col) for col in df.columns}, inplace=True)
100个循环,最佳3:每个循环15.6毫秒
的第一条输出线%%prun:
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.018 0.018 0.018 0.018 {gc.collect}
inplace = False
%%timeit
np.random.seed(0)
r,c = (7,3)
t = np.random.rand(r)
df1 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
indx = np.random.choice(range(r),r/3, replace=False)
t[indx] = np.random.rand(len(indx))
df2 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
df = (df1-df2).dropna()
## avoid inplace:
df = df.rename(columns={col:'d{}'.format(col) for col in df.columns})
1000次循环,最好为3:每个循环1.24毫秒
避免dropna
通过避免该dropna方法,可以恢复预期的性能:
%%timeit
np.random.seed(0)
r,c = (7,3)
t = np.random.rand(r)
df1 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
indx = np.random.choice(range(r),r/3, replace=False)
t[indx] = np.random.rand(len(indx))
df2 = pd.DataFrame(np.random.rand(r,c), columns=range(c), index=t)
#no dropna:
df = (df1-df2)#.dropna()
## inplace rename:
df.rename(columns={col:'d{}'.format(col) for col in df.columns}, inplace=True)
1000个循环,每个循环最好3:865 µs
1000个循环,最好为3:每个循环902 µs
陪伴而非守候