2012-01-21 5 views
0

Ниже приведен тестовый код, мой фактический код выглядит почти аналогичным, в котором я использую исходную матрицу, которая генерируется случайным образом. Как я могу оптимизировать это вложенное для циклов. Я знаю, что это возможно в python, но я не могу этого сделать.Оптимизация множественных вложенных циклов в python

import time 
import numpy as np 

a = 1000 
b = 500 
sum2,sum3,sum4 = 0 
t0 = time.time() 

x = np.random.random(a*a).reshape([a,a]) 

for outer1 in xrange(0,a): 
    for inner1 in xrange(0,b): 
     for outer2 in xrange(0,a): 
      for inner2 in xrange(0, a): 
       sum2 += x[outer2][inner2] #this is not the only operation I have 
     for outer3 in xrange(0,a): 
      for inner3 in xrange(0, a): 
       sum3 += x[outer3][inner3] #this is not the only operation I have 
     for outer4 in xrange(0,a): 
      for inner4 in xrange(0, a): 
       sum4 += x[outer4][inner4] #this is not the only operation I have 

print time.time() - t0 
print 'sum2: '+str(sum2)+' sum3: '+str(sum3)+' sum4: '+str(sum4) 

Я использую python 2.7. Спасибо.

+0

Дополнительные вычисления, которые вы делаете, имеют большое значение в том, как вы можете оптимизировать свой код. И, также, скорее всего, станут причиной любого узкого места, а не этих сумм. – Dunes

ответ

2

С помощью массивов Numpy способ оптимизации вычислений - максимально использовать векторизованные операции. В вашем примере, так как она выглядит, как вы суммируя элементы каждого массива, вы должны держать массив 1-мерным и просто использовать функцию sum непосредственно:

x = np.random.random(a*a) 
sum2 = x.sum() 

и так далее.

Аналогичным образом, для вашего фактического кода вам необходимо перевести ваши петли в векторизованные операции. Я ничего не могу сказать о том, как это сделать, не зная, что такое фактическое вычисление.

1

Как подсказывает ваш код, sum2 зависит только от значений outer2 и inner2, и это будет сделано в течение двух петель, переменные outer1 и inner1. В вставленном коде вы можете просто оставить 2 внешние петли (outer1 и inner1), а вместо этого умножить значение sum2 на a*b. Это устраняет два цикла и заменяет их умножением, которое должно быть быстрее.

Я не знаю, возможно ли это с вашим фактическим кодом, но в коде, который вы отправили, это должно быть возможно.

Смежные вопросы