Por que `numpy.einsum` funciona mais rápido com` float32` que `float16` ou` uint16`? [duplicado]

Esta pergunta já tem uma resposta aqui:

Desempenho de tipos de dados numpy do Python 2 respostas

No meu benchmark usando o numpy 1.12.0, calculando produtos pontuais comfloat32 ndarrays é muito mais rápido que os outros tipos de dados:

In [3]: f16 = np.random.random((500000, 128)).astype('float16')
In [4]: f32 = np.random.random((500000, 128)).astype('float32')
In [5]: uint = np.random.randint(1, 60000, (500000, 128)).astype('uint16')

In [7]: %timeit np.einsum('ij,ij->i', f16, f16)
1 loop, best of 3: 320 ms per loop

In [8]: %timeit np.einsum('ij,ij->i', f32, f32)
The slowest run took 4.88 times longer than the fastest. This could mean that an intermediate result is being cached.
10 loops, best of 3: 19 ms per loop

In [9]: %timeit np.einsum('ij,ij->i', uint, uint)
10 loops, best of 3: 43.5 ms per loop

Eu tentei criar perfileinsum, mas apenas delega toda a computação para uma função C, então não sei qual é o principal motivo dessa diferença de desempenho.

questionAnswers(1)

yourAnswerToTheQuestion