2010-07-09 6 views
3

dit que je voulais créer un tableau (liste non) de 1.000.000 twos en python, comme ceci:Quel est le moyen le plus rapide d'initialiser un tableau d'entiers en python?

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

Quelle serait un moyen simple mais rapide de le faire?

+1

Je ne connais pratiquement pas Python, mais pourrait-il être quelque chose comme 'array = [2 for x in 1..1000000]'? –

+0

Cette question préalable pourrait vous aider - http://stackoverflow.com/questions/1859864/how-to-create-an-integer-array-in-python – chauncey

+0

@mmyers: Votre suggestion n'est pas une syntaxe valide; vous pouvez vouloir dire '[2 pour x dans xrange (1000000)]'; '[2] * 1000000' serait plus rapide et plus simple; cependant, ils produisent un 'list' -' array' et 'list' signifient des choses différentes en Python. –

Répondre

6

Est-ce ce que vous cherchez?

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

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

Vous pouvez obtenir simplement une liste avec ceci:

twosList = [2] * 1000000 

- ÉDITÉ -

Je mis à jour pour refléter cette information dans une autre réponse. Il semblerait que vous pouvez augmenter la vitesse d'un ratio de ~ 9: 1 en ajustant légèrement la syntaxe. Le crédit complet appartient à @ john-machin. Je n'étais pas conscient que vous pouviez multiplier l'objet tableau de la même manière que vous le feriez pour une liste.

+0

sloooow ... voir ma réponse –

1
aList = [2 for x in range(1000000)] 

ou la base sur le lien de chauncey

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

En utilisant le plus rapide du module timeit vous pouvez comprendre genre de ce que le faire est:

Tout d'abord, mettre que de nombreux chiffres dans une liste va tuer votre machine le plus probable car il va le stocker en mémoire. Cependant, vous pouvez tester l'exécution en utilisant quelque chose comme ça. Il a couru sur mon ordinateur pendant longtemps avant que je viens de donner, mais je suis sur un vieux PC:

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

d'autre option Ther vous pouvez regarder dans le module utilise array qui est comme indiqué, efficient arrays of numeric values

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

Je n'ai pas testé l'heure de fin des deux mais je suis sûr que le module array, qui est conçu pour les ensembles de nombres sera plus rapide.

Edit: Encore plus amusant, vous pouvez jeter un oeil à numpy qui semble effectivement avoir l'exécution la plus rapide:

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

Encore plus rapide des commentaires:

a = 2 * ones(10000000) 

Awesmoe!

+1

Numpy a aussi des fonctions d'usine dédiées: 'a = 2 * ones (1000000)' – Philipp

+0

@Philipp: C'est génial! C'est pourquoi j'aime tellement. La curiosité de répondre à une question conduit à de nombreux apprentissages pour moi-même. Bravo :-) – Bartek

+0

Si vous ne pouvez pas insérer une liste ou un tableau d'un million d'éléments dans la mémoire de votre machine, c'est déjà mort. Aussi, je ne comprends pas "Il a fonctionné sur mon ordinateur pendant longtemps" ... voir ma réponse pour (a) comment faire un timing simple en utilisant 'timeit' à l'invite de commande (b) combien petit les temps mesurés (millisecondes!) sont (ordinateur portable de 4 ans exécutant Win XP SP2) –

11

La réponse actuellement acceptée n'est PAS la plus rapide en utilisant array.array; au moins ce n'est pas le plus lent - Comparez-les:

[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: g.d.d.c] 
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 

C'est un rapport d'environ 9 à 1 ...

+0

+1 et j'ai mis à jour ma réponse avec l'autre syntaxe et un commentaire. Je vous remercie de le faire remarquer. –

+1

slooow :) ... hybride de ces deux versions est mieux –

2

Une approche hybride fonctionne le plus rapide pour moi

$ 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 
0

Si la valeur initiale ne doit pas être non nul et si vous avez/dev/zero disponible sur votre plate-forme, ce qui suit est d'environ 4,7 fois plus rapide que le tableau ('l', [0]) * solution de taille:

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

en question How to initialise an integer array.array object with zeros in Python Je cherche un meilleur moyen.

Questions connexes