Seaborn lineplot高CPU;与matplotlib

时间:2019-05-16 14:28:19

标签: python pandas performance matplotlib seaborn

我有以下数据框。

In [12]: dfFinal
Out[12]: 
           module                                            vectime                                           vecvalue
1906  client1.tcp  [1.1007512, 1.1015024, 1.1022536, 1.1030048, 1...  [0.0007512, 0.0007512, 0.0007512, 0.0007512, 0...
1912  client2.tcp  [1.10079784, 1.10159568, 1.10239352, 1.1031913...  [0.00079784, 0.00079784, 0.00079784, 0.0007978...
1918  client3.tcp  [1.10084448, 1.10168896, 1.10258008, 1.1036111...  [0.00084448, 0.00084448, 0.00089112, 0.0010310...

我想绘制每个模块的时间序列vecvaluevectime

结果如下: enter image description here

为此,我可以执行以下操作:

1)Matplotlib

start = datetime.datetime.now()

for row in dfFinal.itertuples():
    t = row.vectime
    x = row.vecvalue
    x = runningAvg(x)
    plot(t,x)

total = (datetime.datetime.now() - start).total_seconds()
print("Total time: ",total)

这样做需要0.07005秒才能完成。

2)Seaborn

start = datetime.datetime.now()

for row in dfFinal.itertuples():
    t = row.vectime
    x = row.vecvalue
    x = runningAvg(x)
    DF = pd.DataFrame({'x':x, 't':t})
    sns.lineplot(x='t', y='x', data=DF)

total = (datetime.datetime.now() - start).total_seconds()
print("Total time: ",total)

这样做需要19.157463秒才能完成。

为什么会有如此大的差异?我做错了什么事情,导致处理一个相当小的DF需要这么长时间?

1 个答案:

答案 0 :(得分:3)

在对ci=None的通话中设置lineplot;否则,将计算置信区间,从而导致一些昂贵(且不必要)的df.groupby通话。

顺便说一句:snakeviz模块是快速查找计算瓶颈的好工具。