Potrzebuję zoptymalizować skrypt, który intensywnie wykorzystuje obliczanie wektorów L1. Jak wiemy, norma L1 w tym przypadku jest po prostu sumą wartości bezwzględnych. Kiedy czas, jak szybko numpy jest w tym zadaniu, znalazłem coś dziwnego: dodanie wszystkich elementów wektorowych jest około 3 razy szybsze niż przyjęcie bezwzględnej wartości każdego elementu wektora. Jest to zaskakujący wynik, ponieważ dodanie jest dość skomplikowane w porównaniu do przyjmowania wartości bezwzględnej, co wymaga jedynie zerowania co 32-tego bloku danych (zakładając float32).Dlaczego plik numpy.absolute() jest tak wolny?
Dlaczego ten dodatek jest 3x szybszy niż prosta operacja bitowa?
import numpy as np
a = np.random.rand(10000000)
%timeit np.sum(a)
13.9 ms ± 87.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.abs(a)
41.2 ms ± 92.3 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
Bardzo prawdopodobne z powodu prognozy branży - https://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array – Maxim
Doesn ' t pokazuje jakiekolwiek przyspieszenie podczas sortowania tablicy wejściowej. – Lugi