当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 索引numpy记录数组非常慢

来源:互联网 收集:自由互联 发布时间:2021-06-22
看起来索引带有索引数组的numpy记录数组的速度非常慢.但是,使用np.view可以执行相同的操作10-15倍. 这种差异背后有原因吗?为什么不以更快的方式实现记录数组的索引? (另见sorting nu
看起来索引带有索引数组的numpy记录数组的速度非常慢.但是,使用np.view可以执行相同的操作10-15倍.

这种差异背后有原因吗?为什么不以更快的方式实现记录数组的索引? (另见sorting numpy structured and record arrays is very slow)

mydtype = np.dtype("i4,i8")
mydtype.names = ("foo","bar")
N = 100000

foobar = np.zeros(N,dtype = mydtype)
foobar["foo"] = np.random.randint(0,100,N)
foobar["bar"] = np.random.randint(0,10000,N)

b = np.lexsort((foobar["foo"],foobar["bar"]))

timeit foobar[b]
100 loops, best of 3: 11.2 ms per loop

timeit foobar.view("|S12")[b].view(mydtype)
1000 loops, best of 3: 882 µs per loop

显然,两个结果都给出了相同的答案.

如 https://stackoverflow.com/a/23303357/901925所述,采取比双视图方法更快的速度:

np.take(foobar,b)

事实上,它的速度和它一样快

foobar['foo'][b]

如果您想进一步深入了解源代码,https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/item_selection.c是一个起点.

我的猜测是__getitem__的实现方式会导致这种差异.也许作为早期记录处理的残余,当dtype被混合时(以及用于高级索引),它需要不同的路径.

布尔掩码索引似乎不受此减速的影响.基本切片索引也是如此.

网友评论