我有以下片段,它提取序列中所有唯一值(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扩展(例如numpy
或pandas
方法),实现同样的事情?
非常感谢.
并不像我原先希望的那样令人印象深刻(在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