我正在进行200亿次计算,事实证明,最慢的步骤是两个数量级,只是访问Pandas数据帧中的相关行。
%timeit x = query_results.ix[i]
10000 loops, best of 3: 155 µs per loop
我们怎样才能将速度降低一到两个数量级?
此Dataframe有200,000行和11列,所有字符串都是各种长度。使字符串固定长度几乎不会影响访问速度。使值浮动(这个用例不可行)会使速度降低一半左右。
编辑更多上下文:
这几乎是整个用例,使用BrenBarn的建议来使用iloc
而不是ix
。请注意,我们一次只能访问两行。大量的计算来自比较每一行到每一行(200,000 ^ 2/2)。
test = pd.DataFrame(index=arange(200000),columns=arange(11))
test.ix[:,:] = 'asdfasdf'
i = 0
j = 1
%timeit x = set(test.iloc[i]).intersection(test.iloc[j])
1000 loops, best of 3: 235 µs per loop
如果这个数字更像是5μs,那将是太棒了。
旁注,作为每个μs计数原因的示例:并非每个单元实际上都包含数据,因此我仍需要从结果数据中删除缺失值(nan
),这将花费更多μs。对于这些目的,执行test.iloc[i].dropna()
之类的操作非常慢。
答案 0 :(得分:0)
In [21]: tx = test.values
In [22]: tx
Out[22]:
array([['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
'asdfasdf'],
['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
'asdfasdf'],
['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
'asdfasdf'],
...,
['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
'asdfasdf'],
['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
'asdfasdf'],
['asdfasdf', 'asdfasdf', 'asdfasdf', ..., 'asdfasdf', 'asdfasdf',
'asdfasdf']], dtype=object)
In [23]: %timeit x = set(tx[i]).intersection(tx[j])
100000 loops, best of 3: 1.99 µs per loop