Sto usando la funzione numpy.array() per creare numpy.float64 ndarrays dalle liste.Perché numpy.array() a volte è molto lento?
Ho notato che questo è molto lento quando l'elenco contiene Nessuno o viene fornito un elenco di elenchi.
Di seguito sono riportati alcuni esempi con le volte. Esistono soluzioni ovvie, ma perché è così lento?
Esempi di elenco di 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
esempi di lista di liste:
### 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
per creare un array vuoto, utilizzare 'a = numpy.empty (100000)'. Per creare una matrice con tutti gli zeri: 'a = numpy.zeros (100000)'. – jfs
Il mio obiettivo non è creare un array di zero o vuoto, ma sto riscontrando problemi di prestazioni quando None è nel set di dati. Se creo l'array e prima e imposto i valori, ho praticamente lo stesso problema. In [18]: a = numpy.empty ((100000,)) In [19]:% timeit un [:] = [nessuna] * 100000 1 loop, migliore di 3: 209 ms per loop In [20]:% timeit a [:] = [0] * 100000 100 loop, meglio di 3: 9,59 ms per loop – MarkW
in realtà è una domanda interessante: perché '[3]' è molto più lento di '[5 ] '(potrebbe essere un bug o solo un caso d'uso raro non ottimizzato). Per ripetere 'NaN', chiama' numpy.repeat (float ("nan"), 100000) ' – jfs