如何加速 numpy 数组屏蔽?

How to accelerate numpy array masking?

我正在分析一段 Python 代码的性能,使用 line profiler.

在代码中,我有一个形状为 (106906,) 且 dtype=int64 的 numpy 数组 tt。在分析器的帮助下,我发现 mask[tt]=True 下面的第二行非常慢。反正有加速吗?如果重要的话,我在 Python 3。

   mask = np.zeros(100000, dtype='bool')
   mask[tt] = True

您可以按照@orlevii 的建议使用 Numba:

from numba import njit
@njit
def f(mask,tt):
    mask[tt] = True
#Test:
mask = np.zeros(1000000, dtype='bool')
tt = np.random.randint(0,1000000,106906)
f(mask,tt)

一项简单的 %%timeit 检查表明您应该期望执行速度大约提高 3 倍。

进一步 speed-up 可以通过利用 GPU 来实现。如何使用 PyTorch 执行此操作的示例:

import torch
mask = torch.zeros(1000000).type(torch.cuda.FloatTensor)
tt = torch.randint(0,1000000,torch.Size([106906])).type(torch.cuda.LongTensor)
mask[tt] =  True

请注意,这里我们使用了一个 torch.Tensor 对象,它等同于 PyTorch 中的 numpy.ndarray。仅当您拥有带 CUDA 的 GPU(NVIDIA)时,代码才会 运行。预计 x30 speed-up w.r.t 您在 Tesla V100-SXM2 上的原始代码。