【发布时间】:2013-08-14 14:32:12
【问题描述】:
我是 Python 新手,对 pandas 也很陌生。
我想使用它,但是将两个 cols 的 pandas 过滤与字典列表(均为 80 行)进行比较,它似乎有巨大的性能差异。我最大的问题是为什么 pandas 需要这么长时间才能运行。
熊猫数据框
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 每个循环
还有其他使用 pandas 但响应时间相似的好方法吗?
脚本是这样的..
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)
然后我计时。
【问题讨论】:
-
您能否附上您的数据文件并在创建
dfEnts和ents结构的地方添加一段代码?ents在我看来更像是一个列表而不是字典。 -
这只是显示了一个小的函数调用开销;用 10000 个元素试试这个
-
thx 4 您的评论.. 抱歉,是的,是 dics 列表。无论如何,dataFrame 性能是我关心的问题,因为我可以理解这种性能......我做错了什么?谢谢
-
杰夫,您是说熊猫仅在最少的记录/行数之上表现良好。这是在某处记录的限制吗?谢谢
-
维克托有一个很好的例子;有时,对于一个很小的数据集,事物会具有不同的性能特征。耗时小于 1 毫秒的操作很难优化(而且不值得花时间这样做,除非它们被多次调用)。如果是这种情况,那么您应该改变处理问题的方式。
标签: python performance pandas