2017-09-21 3 views
-1

J'ai juste compris que 2 boucles imbriquées fonctionnent très lentement en Python. La charge de l'UC reste autour de 0% mais elle fonctionne toujours lentement. Pourquoi? Comment puis-je résoudre ce problème?Les boucles imbriquées fonctionnent trop lentement en Python

Initialisation (ne devrait pas commenter pour le faire fonctionner rapidement):

a = imresize(image, (maxY, maxX), 'lanczos') 
    b = imresize(image, (maxY * 2, maxX), 'lanczos') 

Code lent:

result = np.empty((maxY, maxX, 3), dtype=np.uint16) 
    for y in range(maxY): 
     for x in range(maxX): 
      result[y, x] = [a[y, x], a[y, x], a[y, x]] 

Et celui-ci fonctionne encore plus lent:

result = np.empty((maxY, maxX, 3), dtype=np.uint16) 
    for y in range(maxY): 
     for x in range(maxX): 
      result[y, x] = [a[y, x], b[y*2, x], b[y*2+1, x]] 

Existe-t-il un autre code plus efficace pour atteindre les mêmes résultats?

Forme de a est (299, 299), b - (598, 299), résultat - (299, 299, 3). J'appelle le code environ 5000 fois (et j'attends environ 10 minutes pour cette quantité de données). Si je commente le code fourni, tout fonctionne juste une seconde.

+1

1) réparer votre algorithme, 2) utiliser numpy 3) utiliser CPython sont toutes les options. Sans plus d'informations, il est difficile de dire quoi que ce soit –

+1

Aucune information sur l'une de ces variables ou votre évaluation de cpu-load est donnée ... – sascha

+1

Toujours, * toujours *, ** toujours ** utiliser NumPy lorsque vous effectuez des opérations sur chaque élément de un tableau. – o11c

Répondre

1

Veuillez utiliser la vectorisation pour fixer votre code. comme ça:

result[:,:,0] = a 
+0

Bonne idée! Mais je dois toujours utiliser une boucle avec elle. – Dmitry

1

mémoire Allouer est toujours lent dans toutes les langues, donc vous devez éviter. Dans votre exemple, vous créez un list dans chaque boucle.

Vous devriez utiliser quelque chose comme ce qui suit:

result = np.empty((maxY, maxX, 3), dtype=np.uint16) 
for y in range(maxY): 
    for x in range(maxX): 
     result[y, x, 0] = a[y, x] 
     result[y, x, 1] = a[y, x] 
     result[y, x, 2] = a[y, x] 

Ou comme mentionné par @ user3237718, vous devez utiliser:

result = np.empty((maxY, maxX, 3), dtype=np.uint16) 
for i in range(3): 
    result[:, :, i] = a 

Le point clé est d'éviter allocation dynamique de mémoire.

+0

Déjà essayé la première version du code moi-même. Cela n'a aidé qu'un petit peu. – Dmitry

+0

@Dmitry Essayez le second, ça aide beaucoup. – Sraw