我已將此報告為關于熊貓問題的問題。同時,我將其發布在這里,以期節省其他人的時間,以防他們遇到類似的問題。在對需要優化的過程進行性能分析時,我發現將列重命名為IN120可以將性能(執行時間)提高x120。分析表明這與垃圾收集有關(請參閱下文)。此外,通過避免dropna方法,可以恢復預期的性能。以下簡短示例演示了系數x12:import pandas as pdimport numpy as npinplace = True%%timeitnp.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%%timeitnp.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方法,可以恢復預期的性能:%%timeitnp.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 μs1000個循環,最好為3:每個循環902 μs
2 回答

陪伴而非守候
TA貢獻1757條經驗 獲得超8個贊
我不會說語法沒有任何優勢-它使您可以避免在等號的兩邊都放長規范。這是some_long_complicated_expression[some:long_slice, more_information_here] += 1
over 優勢的一種變體some_long_complicated_expression[some:long_slice, more_information_here] = some_long_complicated_expression[some:long_slice, more_information_here] + 1
。
添加回答
舉報
0/150
提交
取消