¿Cuál es la forma más rápida de inicializar una matriz de enteros en python?

Digamos que quería crear una matriz (NO lista) de 1,000,000 de dos en python, como esto:

array = [2, 2, 2, ...... , 2]

¿Cuál sería una forma rápida pero simple de hacerlo?

¿Es esto lo que buscas?

 # slower. twosArr = array.array('i', [2] * 1000000) # faster. twosArr = array.array('i', [2]) * 1000000 

Puedes obtener solo una lista con esto:

 twosList = [2] * 1000000 

– EDITADO –

Actualicé esto para reflejar información en otra respuesta. Parece que puede boost la velocidad en una proporción de ~ 9: 1 ajustando la syntax ligeramente. El crédito completo pertenece a @ john-machin. No sabía que podría multiplicar el objeto de matriz de la misma manera que podría hacerlo en una lista.

La respuesta actualmente aceptada NO es la forma más rápida de usar array.array ; al menos no es el más lento – compara estos:

 [source: johncatfish (quoting chauncey), Bartek] python -m timeit -s"import array" "arr = array.array('i', (2 for i in range(0,1000000)))" 10 loops, best of 3: 543 msec per loop [source: gddc] python -m timeit -s"import array" "arr = array.array('i', [2] * 1000000)" 10 loops, best of 3: 141 msec per loop python -m timeit -s"import array" "arr = array.array('i', [2]) * 1000000" 100 loops, best of 3: 15.7 msec per loop 

Eso es una relación de alrededor de 9 a 1 …

Usando el módulo de timeit puedes averiguar qué es lo más rápido al hacer esto:

En primer lugar, poner tantos dígitos en una lista probablemente acabará con su máquina, ya que la almacenará en la memoria.

Sin embargo, puedes probar la ejecución usando algo así. Se ejecutó en mi computadora durante mucho tiempo antes de que me di por vencido, pero estoy en una PC más antigua:

 timeit.Timer('[2] * 1000000').timeit() 

La otra opción que puede examinar es utilizar el módulo de matriz , que es como se indica, efficient arrays of numeric values

 array.array('i', (2 for i in range(0, 1000000))) 

No probé el tiempo de finalización de ambos, pero estoy seguro de que el módulo de array , que está diseñado para conjuntos de números, será más rápido.

Edición: aún más divertido, podrías echarle un vistazo a numpy, que en realidad parece tener la ejecución más rápida:

 from numpy import * array( [2 for i in range(0, 1000000)]) 

Incluso más rápido de los comentarios:

 a = 2 * ones(10000000) 

¡Awesmoe!

Un enfoque híbrido funciona más rápido para mí

 $ python -m timeit -s"import array" "arr = array.array('i', [2]*100) * 10000" 100 loops, best of 3: 5.38 msec per loop 

 $ python -m timeit -s"import array" "arr = array.array('i', [2]) * 1000000" 10 loops, best of 3: 20.3 msec per loop $ python -m timeit -s"import array" "arr = array.array('i', [2]*10) * 100000" 100 loops, best of 3: 6.69 msec per loop $ python -m timeit -s"import array" "arr = array.array('i', [2]*100) * 10000" 100 loops, best of 3: 5.38 msec per loop $ python -m timeit -s"import array" "arr = array.array('i', [2]*1000) * 1000" 100 loops, best of 3: 5.47 msec per loop $ python -m timeit -s"import array" "arr = array.array('i', [2]*10000) * 100" 100 loops, best of 3: 6.13 msec per loop $ python -m timeit -s"import array" "arr = array.array('i', [2]*100000) * 10" 10 loops, best of 3: 14.9 msec per loop $ python -m timeit -s"import array" "arr = array.array('i', [2]*1000000)" 10 loops, best of 3: 77.7 msec per loop 
 aList = [2 for x in range(1000000)] 

o base en enlace chauncey

 anArray =array.array('i', (2 for i in range(0,1000000))) 

Si el valor inicial no tiene que ser distinto de cero y si tiene / dev / cero disponible en su plataforma, lo siguiente es aproximadamente 4.7 veces más rápido que la solución de tamaño de matriz (‘L’, [0]) *:

 myarray = array.array('L') f = open('/dev/zero', 'rb') myarray.fromfile(f, size) f.close() 

En cuestión Cómo inicializar un objeto array.array entero con ceros en Python , estoy buscando una mejor manera.