我是Python的新手,也是pandas的新手。
我想使用它,但比较两个cols的pandas过滤和一个字典列表(两个都是80行),它似乎有巨大的性能差异。我的大问题是为什么熊猫需要这么长时间才能运行。
pandas dataFrame
timeit a = dfEnts[(dfEnts["col"]=="ro") & (dfEnts["sty"]=="hz")]
1000循环,最好的3: 239 us 每循环
vs简单的dics列表
timeit b = [ix for ix,ent in enumerate(ents) if (ent['col']=="ro") & (ent["sty"]=="hz")]
100000次循环,最好是3次: 11.4 us 每次循环
vs numpy结构化/记录数组
timeit a = entsRec[(entsRec["col"]=="ro") & (entsRec["sty"]=="hz")]
100000个循环,最好是3个: 18.2 us 每个循环
有没有其他好方法可以使用大熊猫但响应时间相似?
脚本就是这样..
ents = []
for idx in xrange(0,80)
dic = {'n':f, 'p':props,'li':li,'col':col,'sty':sty,'nu':nu,'ge':ge,'rr':rr,'ssty':ssty}
ents.append(dic)
# DataFrame
dfEnts = pd.DataFrame(ents)
# np rec array
entsTuples = [(ent[ 'n'],ent['p'], ent[ 'li'],ent['col'], ent[ 'sty'], ent['nu'],ent['ge'],ent[ 'rr'], ent['ssty']) for ent in ents]
ents_dt = dtype([('n', 'O'), ('p', 'O'), ('li', 'i1'), ('col', 'O'), ('sty', 'O'), ('nu', 'i1'), ('ge', 'i1'), ('rr', 'i1'), ('ssty', '<i4')])
entsRec = np.array(entsTuples,ents_dt)
然后是我的时间。
答案 0 :(得分:0)
当您处理小型数据集时,该列表可能具有较小的性能优势,因为列表推导和字典查找在Python中已经过优化。但这通常是一个微不足道的差异。一旦你尝试使用更大的数据集,你会发现更大的差异,并开始感受到熊猫图书馆提供的好处。
ents = []
for i in xrange(0, 10000000):
dic = {
'n': i, 'p': i, 'li': i, 'col': i, 'sty': i,
'nu': i, 'ge': i, 'rr': i, 'ssty': i
}
ents.append(dic)
dfEnts = pd.DataFrame(ents)
%%timeit
a = dfEnts[(dfEnts["col"] == 44) & (dfEnts["sty"]== 44)]
10 loops, best of 3: 96.1 ms per loop
%%timeit
b = [ix for ix,ent in enumerate(ents) if (ent['col'] == 44) & (ent["sty"] == 44)]
1 loops, best of 3: 1.68 s per loop
此外,pandas DataFrame
提供的功能远远多于一系列dicts,因此我认为它们甚至不具备可比性。