当前位置:  开发笔记 > 编程语言 > 正文

Python:更快的索引操作

如何解决《Python:更快的索引操作》经验,为你挑选了1个好方法。

我有以下片段,它提取序列中所有唯一值(hashable)的data索引,与规范索引一样,并将它们作为列表存储在字典中:

from collections import defaultdict
idx_lists = defaultdict(list)
for idx, ele in enumerate(data):
    idx_lists[ele].append(idx)

这对我来说是一个很常见的用例.而且我的代码执行时间的90%花在了这几行上.该部分在执行期间传递超过10000次,len(data)每次运行时约为50000到100000次.独特元素的数量大致为50到150.

有没有更快的方法,也许是矢量化/ c扩展(例如numpypandas方法),实现同样的事情?

非常感谢.



1> DSM..:

并不像我原先希望的那样令人印象深刻(在groupby代码路径中仍有相当多的纯Python),但你可能能够将时间减少2-4倍,这取决于你关心的程度确切的最终类型:

import numpy as np, pandas as pd
from collections import defaultdict

def by_dd(data):
    idx_lists = defaultdict(list)
    for idx, ele in enumerate(data):
        idx_lists[ele].append(idx)
    return idx_lists

def by_pand1(data):
    return {k: v.tolist() for k,v in data.groupby(data.values).indices.items()}

def by_pand2(data):
    return data.groupby(data.values).indices

data = pd.Series(np.random.randint(0, 100, size=10**5))    

给我

>>> %timeit by_dd(data)
10 loops, best of 3: 42.9 ms per loop
>>> %timeit by_pand1(data)
100 loops, best of 3: 18.2 ms per loop
>>> %timeit by_pand2(data)
100 loops, best of 3: 11.5 ms per loop

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有