Używam funkcji numpy.array() do tworzenia ndarrays numpy.float64 z list.Dlaczego funkcja numpy.array() jest czasami bardzo powolna?
Zauważyłem, że jest to bardzo powolne, gdy lista zawiera Brak lub wyświetlana jest lista list.
Poniżej znajduje się kilka przykładów razy. Istnieją oczywiste rozwiązania, ale dlaczego jest to tak powolne?
Przykłady listy None:
### Very slow to call array() with list of None
In [3]: %timeit numpy.array([None]*100000, dtype=numpy.float64)
1 loops, best of 3: 240 ms per loop
### Problem doesn't exist with array of zeroes
In [4]: %timeit numpy.array([0.0]*100000, dtype=numpy.float64)
100 loops, best of 3: 9.94 ms per loop
### Also fast if we use dtype=object and convert to float64
In [5]: %timeit numpy.array([None]*100000, dtype=numpy.object).astype(numpy.float64)
100 loops, best of 3: 4.92 ms per loop
### Also fast if we use fromiter() insead of array()
In [6]: %timeit numpy.fromiter([None]*100000, dtype=numpy.float64)
100 loops, best of 3: 3.29 ms per loop
Przykłady liście list:
### Very slow to create column matrix
In [7]: %timeit numpy.array([[0.0]]*100000, dtype=numpy.float64)
1 loops, best of 3: 353 ms per loop
### No problem to create column vector and reshape
In [8]: %timeit numpy.array([0.0]*100000, dtype=numpy.float64).reshape((-1,1))
100 loops, best of 3: 10 ms per loop
### Can use itertools to flatten input lists
In [9]: %timeit numpy.fromiter(itertools.chain.from_iterable([[0.0]]*100000),dtype=numpy.float64).reshape((-1,1))
100 loops, best of 3: 9.65 ms per loop
aby utworzyć pustą tablicę, użyj 'a = numpy.empty (100000)'. Aby utworzyć tablicę z zerami: 'a = numpy.zeros (100000)'. – jfs
Moim celem nie jest utworzenie tablicy zerowej lub pustej, ale mam problemy z wydajnością, gdy Brak jest w zestawie danych. Jeśli utworzę tablicę, a najpierw i ustawię wartości, mam prawie ten sam problem. w [18]: A = numpy.empty ((100000)) w [19]:% timeit A [:] = [brak] * 100000 1 pętle, najlepiej od 3: 209 ms na pętli W [20]:% timeit a [:] = [0] * 100000 100 pętli, najlepiej 3: 9,59 ms na pętlę – MarkW
faktycznie jest to interesujące pytanie: dlaczego '[3]' jest znacznie wolniejsze niż '[5 ] '(może to być błąd lub tylko rzadki przypadek użycia, który nie jest zoptymalizowany). Aby powtórzyć 'NaN', zadzwoń' numpy.repeat (float ("nan"), 100000) ' – jfs