(tl; dr:. La respuesta exacta a su pregunta es numpy.empty
o numpy.empty_like
, pero es probable que no les importa y puede salir con el uso myList = [None]*10000
)
métodos simples
Usted puede inicializar su lista para todo el mismo elemento. Si tiene sentido semánticamente usar un valor no numérico (que dará un error más adelante si lo usas, lo cual es bueno) o algo así como 0 (inusual ... puede ser útil si estás escribiendo una matriz dispersa o el ' valor por defecto' debe ser 0 y no estás preocupado por los bichos) depende de usted:
>>> [None for _ in range(10)]
[None, None, None, None, None, None, None, None, None, None]
(Aquí _
es sólo un nombre de variable, se podría haber utilizado i
)
también puede. hazlo así:
>>> [None]*10
[None, None, None, None, None, None, None, None, None, None]
Probablemente don No es necesario optimizar esto. También puede añadir a la matriz cada vez que se necesita:
>>> x = []
>>> for i in range(10):
>>> x.append(i)
Comparación de rendimiento de métodos simples
¿Cuál es mejor?
>>> def initAndWrite_test():
... x = [None]*10000
... for i in range(10000):
... x[i] = i
...
>>> def initAndWrite2_test():
... x = [None for _ in range(10000)]
... for i in range(10000):
... x[i] = i
...
>>> def appendWrite_test():
... x = []
... for i in range(10000):
... x.append(i)
Resultados en python2.7:
>>> import timeit
>>> for f in [initAndWrite_test, initAndWrite2_test, appendWrite_test]:
... print('{} takes {} usec/loop'.format(f.__name__, timeit.timeit(f, number=1000)*1000))
...
initAndWrite_test takes 714.596033096 usec/loop
initAndWrite2_test takes 981.526136398 usec/loop
appendWrite_test takes 908.597946167 usec/loop
resultados en Python 3.2:
initAndWrite_test takes 641.3581371307373 usec/loop
initAndWrite2_test takes 1033.6499214172363 usec/loop
appendWrite_test takes 895.9040641784668 usec/loop
Como podemos ver, lo más probable es mejor que hacer el lenguaje [None]*10000
tanto en python2 y python3.Sin embargo, si uno está haciendo algo más complicado que la asignación (como cualquier cosa complicada para generar o procesar cada elemento de la lista), entonces la sobrecarga se convierte en una fracción insignificante del costo. Es decir, tal optimización es prematura de la que preocuparse si hace algo razonable con los elementos de su lista.
memoria sin inicializar
Todos estos son sin embargo ineficaz porque pasan por la memoria, escribiendo algo en el proceso. En C, esto es diferente: una matriz no inicializada se llena con memoria aleatoria de basura (nota al margen: que ha sido reasignada del sistema, y puede ser security risk cuando asigna o no puede bloquear y/o no borra la memoria al cerrar el programa) . Esta es una opción de diseño, diseñada para la aceleración: los creadores del lenguaje C pensaron que era mejor no inicializar automáticamente la memoria, y esa era la elección correcta.
Esto no es una aceleración asintótica (porque es O(N)
), pero, por ejemplo, no necesitaría inicializar primero el bloque de memoria completo antes de sobrescribir con las cosas que realmente le interesan. Esto, si fuera posible, es equivalente a algo así como (pseudo-código) x = list(size=10000)
.
Si quiere algo similar en python, puede usar el paquete de manipulación de matriz numérica/N-dimensional-numpy
. Específicamente, numpy.empty
o numpy.empty_like
Esa es la verdadera respuesta a su pregunta.
Has _do_ _not_ _need_ para declarar una lista en Python. Solo inicialízalo cuando quieras _a_lo__utilizarlo. – ronakg
Bien, ¿por qué demonios necesitarías eso? – 0605002
Pyhton no es C++. realmente necesita cambiar su forma de pensar al respecto, no es necesario declarar un tamaño fijo en Python. – WeaselFox