2011-12-02 8 views
5

He visto preguntas similares a esta, pero ninguna aborda directamente el problema. He sincronizado las dos formas siguientes de llenar el conjunto y la mitad del tiempo usando np.zeros() es más rápido y la mitad del tiempo hacerlo directamente es más rápido. ¿Hay una manera preferible? Soy bastante nuevo en el uso de matrices numpy, y me he involucrado con el objetivo de acelerar mi código sin pensar demasiado en la legibilidad.manera más rápida de rellenar una matriz numérica 1D

import numpy as np 
import time 

lis = range(100000) 

timer = time.time() 
list1 = np.array(lis) 
print 'normal array creation', time.time() - timer, 'seconds' 

timer = time.time() 
list2 = np.zeros(len(lis)) 
list2.fill(lis) 
print 'zero, fill - array creation', time.time() - timer, 'seconds' 

Gracias

+0

La forma Pythonic a la velocidad de ejecución de referencia es el uso de la [ 'timeit'] (http://docs.python.org /library/timeit.html) módulo. – mac

+0

@mac ok Lo usaré a partir de ahora. Esta es casi la primera vez/perfil (cProfiler) que he necesitado para sincronizar mis funciones – Anake

Respuesta

5

Si usted tiene una lista de los flotadores a=[x/10. for x in range(100000)], a continuación, puede crear una matriz con:

np.array(a) # 9.92ms 
np.fromiter(a, dtype=np.float) # 5.19ms 

Su enfoque

list2 = np.zeros(len(lis)) 
list2.fill(lis) 

no funcionará como se esperaba. El .fill llena toda la matriz con un valor.

+0

lo siento debería haber sido más explícito, este código fue solo para probar la velocidad, se completará con datos reales cuando lo vaya a usar . (los puntos de datos serán flotantes) – Anake

+1

Para 'np.array' vs.' np.fromiter' Me sorprende que el segundo sea más rápido. Si se trata de un iterador numpy no sabrá cuánta memoria asignar primero. (Debe verificar si puede obtener una longitud). El mejor rendimiento se debe a que está diciendo numpy el tipo explícito para usar. Si pasaste el dtype a 'np.array' eso sería aún más rápido. – AFoglia

1

Su ejemplo de list2 simplemente no funciona: si inspecciona list2, encontrará que aún contiene todos los ceros. Encuentro que buscar legibilidad no es solo un buen objetivo en sí mismo. También da como resultado una mayor probabilidad de código correcto.

+3

Debería haber sido un comentario ... :) – mac

+0

Vaya, realmente no había comprobado que funciona. Gracias por eso – Anake

1

La primera lista se pueden crear más rápido con la función arange numpy:

list3 = np.arange(100000)

También puede ser útil la función linspace.

2

np.fromiter se pre-asignar la matriz de salida si se le da el número de elementos:

a = [x/10. for x in range(100000)] # 10.3ms 
np.fromiter(a, dtype=np.float) # 3.33ms 
np.fromiter(a, dtype=np.float, count=100000) # 3.03ms 
Cuestiones relacionadas