Numpy数组与Python列表在一维矩阵(向量)上的性能

Numpy数组与Python列表在一维矩阵(向量)上的性能,python,arrays,numpy,Python,Arrays,Numpy,我想计算pi,它总结了特定类中的几个标签/高斯混合模型中的标签总数 truy是一个数据帧 指数 标签 0 6. 1. 5. 2. 6. 3. 5. 4. 6. TL;博士 像这样使用np.sum(): np.sum(tr_y.labels.to_numpy()==5)/len(tr_y) 测试 现在让我们做一些实验。我们将使用以下设置: 将熊猫作为pd导入 将numpy作为np导入 tr_y=pd.DataFrame({'labels':[6,5,6,5,6]*200000}) 我们使用更

我想计算pi,它总结了特定类中的几个标签/高斯混合模型中的标签总数

truy是一个数据帧

指数 标签 0 6. 1. 5. 2. 6. 3. 5. 4. 6. TL;博士 像这样使用
np.sum()

np.sum(tr_y.labels.to_numpy()==5)/len(tr_y)
测试 现在让我们做一些实验。我们将使用以下设置:

将熊猫作为pd导入
将numpy作为np导入
tr_y=pd.DataFrame({'labels':[6,5,6,5,6]*200000})
我们使用更大的数据集来查看这些方法是否能够很好地适应更大的输入。这里我们将有一个1000000行的数据集。我们将尝试几种不同的方法,看看它们的性能如何

表现最差的是:

sum(tr_y.labels.to_numpy()==5)/len(tr_y)
1.91s±42.1ms/圈(7次运行的平均值±标准偏差,每个循环1次)

下一个选项平均快14倍:

y_list=tr_y.to_numpy().tolist()
sum([1如果y==5,则y在y_列表中为0])/len(y_列表)
132 ms±2.14 ms/回路(7次运行的平均值±标准偏差,每次10个回路)

之后,我们得到了1.6倍的增长:

sum(tru y.labels==5)/len(tru y)
79.3 ms±796µs/回路(7次运行的平均值±标准偏差,每次10个回路)

但是,这些方法都没有使用numpy进行优化。它们使用numpy数组,但却被python的
sum()
所困扰。如果我们使用优化的
NumPy
版本,我们会得到:

np.sum(tr_y.labels.to_numpy()==5)/len(tr_y)
1.36 ms±6.7µs/圈(7次运行的平均值±标准偏差,每个1000圈)

这次手术平均比我们以前最好的手术快58倍。这更像是承诺给我们的
NumPy
的力量。通过使用
np.sum()
而不是python的标准
sum()
,我们可以将相同的操作速度提高约1400倍(1.9秒vs 1.4毫秒)

闭幕词 由于熊猫系列是基于
NumPy
阵列构建的,因此以下代码的性能与我们的最佳设置非常相似:

np.sum(tru y.labels==5)/len(tru y)
1.83 ms±39.6µs/圈(7次运行的平均值±标准偏差,每个100圈)


除非优化您的代码是必要的,否则我个人会选择此选项,因为它是最清晰的阅读方式,不会损失太多性能。

像这样使用NumPy就像是在您走向商店时用手将车拖到身后-您实际上并没有使用您可以使用的工具的功能。@user2357112supportsMonica,你能解释一下这是怎么回事吗?你是在Python级别进行迭代,而不是在NumPy代码中直接对机器整数进行迭代。我想如果你对1000个元素的数组执行
%timeit np.count\u nonzero(arr==5)/arr.size
,你会有一个很大的发现。