Python: эффективная итерация по многомерному списку - PullRequest
2 голосов
/ 24 ноября 2011

Я использую циклы for для перебора двухмерного списка:

def itr(lpic, lH, lW, x, y):
    '''lpic=2D-Array; lH=Row_count; lW=Column_count;'''
    stack = []
    range_x = range(x-1, x+2)
    range_y = range(y-1, y+2)
    append = stack.append
    for i in range_x:
                if 0<=i<lH:#i is a valid index *Updated
                    for j in range_y:
                        if (0<=j<lW) and (lpic[i][j]=="0"):
                            lpic[i][j] = "1"
                            append([i, j])
    return stack

Я хотел бы знать, есть ли лучший способ сделать то же самое с Python2.5.

Ответы [ 2 ]

5 голосов
/ 24 ноября 2011

Не совсем. В Python 2.6, если вы хотите немного сжать код, вы можете использовать itertools.product(), чтобы превратить его в один цикл for, но общая эффективность не изменилась бы вообще - у вас все равно было бы N*M итераций цикла.

import itertools

def itr(lpic, lH, lW, x, y):
    '''lpic=2D-Array; lH=Row_count; lW=Column_count;'''
    stack = []
    range_x = range(x-1, x+2)
    range_y = range(y-1, y+2)
    append = stack.append
    for i,j in itertools.product(range_x, range_y):
        if 0 <= i < lh and 0 <= j < lW and lpic[i][j]=="0":
            lpic[i][j] = "1"
            append([i, j])
    return stack
4 голосов
/ 24 ноября 2011

Для вашего кода есть две простые оптимизации:

  1. Используйте xrange вместо range. Это предотвратит создание двух временных списков.

  2. Используйте min и max в параметрах для xrange, чтобы пропустить 'if' во внешнем цикле. Итак, ваш код будет выглядеть так:

 
    def itr(lpic, lH, lW, x, y):
    '''lpic=2D-Array; lH=Row_count; lW=Column_count;'''
    stack = []
    range_x = xrange(max(0,x-1), min(lH,x+2))
    range_y = xrange(max(0,y-1), min(lW,y+2))
    append = stack.append
    for i in range_x:
      for j in range_y:
          if lpic[i][j]=="0":
              lpic[i][j] = "1"
              append([i, j])
    return stack

Это немного повысит производительность.

...