我有一个包含大量数值的表,我知道我可以提取列并对其执行max(),但是可能有一种方法可以使用in-kernel方法来实现。但似乎无法找到它。
答案 0 :(得分:6)
在我做过的测试中,使用iterrows方法而不是在哪里可以获得超过两倍的结果:
In [117]: timeit max(row['timestamp'] for row in table.iterrows(stop=1000000))
1 loops, best of 3: 1 s per loop
In [118]: timeit max(row['timestamp'] for row in table.where('(timestamp<=Tf)'))
1 loops, best of 3: 2.21 s per loop
In [120]: timeit max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 974 ms per loop
In [121]: timeit np.max(frames.cols.timestamp[:1000000])
1 loops, best of 3: 876 ms per loop
注意,上面的Tf是该列的1000000条目(它是Float64)。
由于问题没有要求进行比较检查,因此可以避免测试... 请注意,问题中提出的方法(将数据加载为numpy数组)仍然稍微快一点(尽管差异小于3%,对于较大的数据集而言,进一步缩小,我没有测试超过10 ^ 7行)。 我发现使用max numpy函数的最佳结果(见上文)。
我也很乐意学习更有效的方法!
答案 1 :(得分:3)
我发现这样做的最快方法是将你的表格索引到你感兴趣的cols上:
table.cols.timestamp.createCSIndex()
一旦编入索引,获得最大值几乎是即时的:
max_timestamp = table.cols.timestamp[table.colindexes['timestamp'][-1]]
这将首先从表的Index对象获取时间戳列(table.colindexes['timestamp'][-1]
)的最后一个(对应于最大时间戳)行索引,然后它将只通过索引获取它指向的行进入相应的列引用(table.cols.timestamp
)。
答案 2 :(得分:1)
来自High Performance Data Management with PyTables & Family(pdf):
e = sum(row['col1'] for row in table.where(3<table.cols.col2<=20))
修改此项以使用max()
:
e = max(row['col1'] for row in table.where(3<table.cols.col2<=20))