在Pandas中快速访问行的一部分
我正在进行200亿次计算,结果发现,最慢的步骤是访问Pandas数据框中的相关行,这个步骤比其他步骤慢了两个数量级。
%timeit x = query_results.ix[i]
10000 loops, best of 3: 155 µs per loop
我们怎么才能把这个速度提高一到两个数量级呢?
这个数据框有20万行和11列,所有的内容都是不同长度的字符串。把字符串变成固定长度几乎没有提高访问速度。把值改成浮点数(但这对我的情况不适用)大约能把速度提高一半。
补充一下背景信息:
这是整个用例的大致情况,按照BrenBarn的建议,使用iloc
而不是ix
。注意我们每次只访问两行。大量的计算是因为要比较每一行和其他每一行(20万^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微秒,那就太好了。
顺便提一下,为什么每个微秒都很重要:并不是每个单元格都有数据,所以我还需要从结果中去掉缺失值(nan
),这又会花费更多的微秒。像test.iloc[i].dropna()
这样的操作在这个情况下非常慢。
1 个回答
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如,有人可能在使用一个叫做“库”的东西时,发现它的某些功能没有按预期工作。这种情况可能会让人感到困惑,因为我们不知道问题出在哪里。
通常,解决这类问题的第一步是检查我们使用的代码,看看是否有拼写错误或者用法不对的地方。因为很多时候,问题可能只是因为我们写错了某个单词,或者没有按照正确的方式调用某个功能。
另外,查看文档也是个好主意。文档就像是使用说明书,里面会告诉我们如何正确使用这个库的各种功能。如果我们能认真阅读文档,很多问题就能迎刃而解。
如果自己解决不了,还可以去一些编程社区,比如StackOverflow,向其他人求助。在那里,有很多经验丰富的程序员愿意帮助新手解决问题。
总之,遇到问题时不要慌张,先检查代码,再看文档,最后可以寻求帮助。这样一步一步来,问题通常都能得到解决。
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