熊猫:在dropna之后就地重命名的性能下降

我已将此报告为关于熊猫问题的问题。同时,我将其发布在这里,以期节省其他人的时间,以防他们遇到类似的问题。


在对需要优化的过程进行性能分析时,我发现将列重命名为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


繁星coding
浏览 664回答 2
2回答

陪伴而非守候

我不会说语法没有任何优势-它使您可以避免在等号的两边都放长规范。这是some_long_complicated_expression[some:long_slice, more_information_here] += 1over 优势的一种变体some_long_complicated_expression[some:long_slice, more_information_here] = some_long_complicated_expression[some:long_slice, more_information_here] + 1。
打开App,查看更多内容
随时随地看视频慕课网APP