您的基准实际上太小,无法显示出真正的差异。追加,每次复制,因此您实际上是在复制大小为N的存储空间N
*(N-1)次。随着数据框大小的增加,这效率极低。在很小的框架内,这当然可能无关紧要。但是,如果您有任何实际尺寸,这很重要。这在此处的文档中特别指出,尽管有点警告。
In [97]: df = Dataframe(np.random.randn(100000,20))In [98]: df['B'] = 'foo'In [99]: df['C'] = pd.Timestamp('20130101')In [103]: df.info()<class 'pandas.core.frame.Dataframe'>Int64Index: 100000 entries, 0 to 99999Data columns (total 22 columns):0 100000 non-null float641 100000 non-null float642 100000 non-null float643 100000 non-null float644 100000 non-null float645 100000 non-null float646 100000 non-null float647 100000 non-null float648 100000 non-null float649 100000 non-null float6410 100000 non-null float6411 100000 non-null float6412 100000 non-null float6413 100000 non-null float6414 100000 non-null float6415 100000 non-null float6416 100000 non-null float6417 100000 non-null float6418 100000 non-null float6419 100000 non-null float64B 100000 non-null objectC 100000 non-null datetime64[ns]dtypes: datetime64[ns](1), float64(20), object(1)memory usage: 17.5+ MB
追加中
In [85]: def f1(): ....: result = df ....: for i in range(9): ....: result = result.append(df) ....: return result ....:
康卡特
In [86]: def f2(): ....: result = [] ....: for i in range(10): ....: result.append(df) ....: return pd.concat(result) ....:In [100]: f1().equals(f2())Out[100]: TrueIn [101]: %timeit f1()1 loops, best of 3: 1.66 s per loopIn [102]: %timeit f2()1 loops, best of 3: 220 ms per loop
请注意,我什至都不会尝试预分配。它有些复杂,特别是因为您要处理多个dtypes(例如,您 可以
制作一个巨大的框架并且简单
.loc并且可以工作)。但是
pd.concat只是简单,可靠和快速。
并从上方选择尺寸
In [104]: df = Dataframe(np.random.randn(2500,40))In [105]: %timeit f1()10 loops, best of 3: 33.1 ms per loopIn [106]: %timeit f2()100 loops, best of 3: 4.23 ms per loop
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)