HDFStore.select 比 DataFrame 切片慢一个数量级?
HDFStore.select an order of magnitude slower than DataFrame slicing?
给定一个带有整数索引和浮点列的简单 DataFrame,此代码:
store = pd.HDFStore('test.hdf5')
print store.select('df', where='index >= 50000')['A'].mean()
至少比这段代码慢 10 倍:
store = pd.HDFStore('test.hdf5')
print store.get('df')['A'][50000:].mean()
表格式或固定格式没有太大区别,select() 调用虽然等同于切片,但要慢得多。
感谢您的任何见解!
如果格式为 'fixed',您无法 进行选择。这会引发异常(访问时间实际上 会 快得多)。也就是说,你可以直接索引一个固定的格式。
In [39]: df = DataFrame(np.random.randn(1000000,10))
In [40]: df.to_hdf('test.h5','df',mode='w',format='table')
In [41]: def f():
df = pd.read_hdf('test.h5','df')
return df.loc[50001:,0]
....:
In [42]: def g():
df = pd.read_hdf('test.h5','df')
return df.loc[df.index>50000,0]
....:
In [43]: def h():
return pd.read_hdf('test.h5','df',where='index>50000')[0]
....:
In [44]: f().equals(g())
Out[44]: True
In [46]: f().equals(h())
Out[46]: True
In [47]: %timeit f()
10 loops, best of 3: 159 ms per loop
In [48]: %timeit g()
10 loops, best of 3: 127 ms per loop
In [49]: %timeit h()
1 loops, best of 3: 499 ms per loop
确定慢一点。但你正在做更多的工作。这是将布尔索引器与整个数组进行比较。如果您阅读整个框架,那么它有很多优点(例如缓存、局部性)。
当然,如果你只是选择一个连续的切片,那么就这样做
In [59]: def i():
return pd.read_hdf('test.h5','df',start=50001)[0]
....:
In [60]: i().equals(h())
Out[60]: True
In [61]: %timeit i()
10 loops, best of 3: 86.6 ms per loop
给定一个带有整数索引和浮点列的简单 DataFrame,此代码:
store = pd.HDFStore('test.hdf5')
print store.select('df', where='index >= 50000')['A'].mean()
至少比这段代码慢 10 倍:
store = pd.HDFStore('test.hdf5')
print store.get('df')['A'][50000:].mean()
表格式或固定格式没有太大区别,select() 调用虽然等同于切片,但要慢得多。
感谢您的任何见解!
如果格式为 'fixed',您无法 进行选择。这会引发异常(访问时间实际上 会 快得多)。也就是说,你可以直接索引一个固定的格式。
In [39]: df = DataFrame(np.random.randn(1000000,10))
In [40]: df.to_hdf('test.h5','df',mode='w',format='table')
In [41]: def f():
df = pd.read_hdf('test.h5','df')
return df.loc[50001:,0]
....:
In [42]: def g():
df = pd.read_hdf('test.h5','df')
return df.loc[df.index>50000,0]
....:
In [43]: def h():
return pd.read_hdf('test.h5','df',where='index>50000')[0]
....:
In [44]: f().equals(g())
Out[44]: True
In [46]: f().equals(h())
Out[46]: True
In [47]: %timeit f()
10 loops, best of 3: 159 ms per loop
In [48]: %timeit g()
10 loops, best of 3: 127 ms per loop
In [49]: %timeit h()
1 loops, best of 3: 499 ms per loop
确定慢一点。但你正在做更多的工作。这是将布尔索引器与整个数组进行比较。如果您阅读整个框架,那么它有很多优点(例如缓存、局部性)。
当然,如果你只是选择一个连续的切片,那么就这样做
In [59]: def i():
return pd.read_hdf('test.h5','df',start=50001)[0]
....:
In [60]: i().equals(h())
Out[60]: True
In [61]: %timeit i()
10 loops, best of 3: 86.6 ms per loop