列表绘制速度与Numpy数组绘制速度

时间:2019-05-14 20:50:04

标签: python list performance numpy plot

您好亲爱的stackoverflow用户。我有一个概念性的问题(因此,不需要任何代码)。我想知道是否有人可以帮助我。
假设我有一个浮点数的python列表和一个相同数字的numpy数组。我想在matplotlib中绘制它们(针对任何东西:时间或空间坐标或其他任何东西-都没关系)。我要二维图。
绘制速度更快的是什么:python列表或numpy数组?
谢谢你。
附言只是为了弄清楚这是一个问题。考虑一个例子:我有一个关于物体速度与时间的数据点。考虑两种情况。首先,我将速度数据点存储在一个python列表中,并将对应的时间存储在另一个python列表中。然后将其绘制在matplotlib中。其次,我将速度数据点存储在一个numpy数组中,并将相应的时间存储在另一个numpy数组中。然后将其绘制在matplotlib中。在哪种情况下绘图会更快?

问题的根源在于我试图用数值方法求解瞬态漂移通量模型。我有相对较多的步骤(时间和空间步骤)。我使用python列表作为解决方案。我没有使用求解器-我编写了自己的代码。当我尝试在matplotlib中绘制数据时,我失败了。 Matplotlib太慢了。我使用pyqtgraph并设法绘制数据。但是我想进一步提高绘图速度。这就是为什么我考虑使用numpy数组。

1 个答案:

答案 0 :(得分:0)

在IPython中进行测试:

np.random.seed(123)

# arrays:
a = np.random.randint(0,1000,10000)
b = np.random.randint(0,1000,10000)

%%timeit -r 10 -n 10
plt.scatter(a, b)
plt.close()
54.7 ms ± 1.43 ms per loop (mean ± std. dev. of 10 runs, 10 loops each)

# lists
c = [f for f in a]
d = [f for f in b]

%%timeit -r 10 -n 10
plt.scatter(c, d)
plt.close()

154 ms ± 5.07 ms per loop (mean ± std. dev. of 10 runs, 10 loops each)

在这里绘制数组看起来更快。

测试更多不同长度的案例:

         #length|mean|sd
lists = [
         (10000, 154, 5.07),
         (1000, 33 , 0.235),
         (100, 21, 0.198),
         (10, 19.4, 0.937)
         ]
arrays = [
         (10000, 54.7, 1.43), 
         (1000, 21.8, 1.51),
         (100,18.4, 1.16),
         (10, 18.1, 1.87)
         ]

# convert to arrays... for faster plotting ;)
lists = np.array(lists)
arrays = np.array(arrays)

plt.errorbar(lists[:,0], lists[:,1], yerr=lists[:,2], color = 'orange', label='lists', fmt='o')
plt.errorbar(arrays[:,0], arrays[:,1], yerr=arrays[:,2], color = 'teal', label='arrays', fmt='o')
plt.xscale('log')
plt.legend()
plt.xlabel('length of plotted data')
plt.ylabel('time per plot / ms')

enter image description here

编辑:

刚刚看到您正在看花车。我用浮点数重新进行了实验,结果几乎相同:

#data generation:
np.random.seed(123)
a = np.random.rand(10000) * 1000
b = np.random.rand(10000) * 1000

lists = [
        (10000, 155, 13.6),
        (1000, 33 , 0.443),
        (100, 21, 0.436),
        (10, 19.1, 1.09)
        ]
arrays = [
         (10000, 54.5, 3.24), 
         (1000, 21.6, 1.97),
         (100, 18.6, 1.61),
         (10, 19.4, 1.51)
]