2016-02-09 3 views
0

У меня есть этот кусок кода:Любой способ понять в понимании dict в понимании dict это?

position = {} 
for x in range(imdim[0]-shapesize+1): 
    for y in range(imdim[1]-shapesize+1): 
    curim = im[x:x+shapesize,y:y+shapesize] 
    shapedict = {} 
    for shapeid,(shape,contour) in enumerate(zip(shapes,contours)): 
     values = {} 
     curshape = curim[shape] 
     curcontour = curim[contour] 
     values['meandiff'] = curshape.mean()-curcontour.mean() 
     values['maxmin'] = int(curshape.min())-int(curcontour.max()) 
     shapedict[shapeid] = values 
    position[(x,y)] = shapedict 
return position 

... где им это изображение (NumPy массив), imdim его формы, формы и контуры список двоичных массивов меньших размеров (shapesize * shapesize), чем я.

Это действительно работает, но мне интересно, есть ли способ написать все это в понимании dict, стиле начала. Если да, будет ли он работать быстрее?

Кроме того, любые комментарии по стилю или оптимизации приветствуются!

+1

https://www.python.org/dev/peps/pep-0020/ -> показатель удобочитаемости. Если код работает и читается (я могу догадаться, что он делает), почему вы хотите сделать его менее читаемым? – Jasper

+0

Я думал, что соображения понимания были заметно быстрее, чем классические для петель. Видимо, я был неправ. – nicoco

ответ

1

Я думаю, что это нужно сделать, но я действительно не проверить:

position = { 
    (x, y): { 
     shapeid: {'meandiff': curim[shape].mean() - curim[contour].mean(), 
        'maxmin': int(curim[shape].min()) - int(curim[contour].max())} 
     for shapeid,(shape,contour) in enumerate(zip(shapes,contours)) 
    } 
    for (x,y,curim) in ((x, y, im[x:x+shapesize, y:y+shapesize]) 
      for x in range(imdim[0]-shapesize+1) 
      for y in range(imdim[1]-shapesize+1) 
    ) 
} 

Хитрости является временным переменными, которые определяют. Для curim Я создал внутреннее выражение генератора, иначе вам нужно было бы написать это выражение четыре раза. Вы можете сделать то же самое для curshape и curcontour, но я не думаю, что это стоит дополнительного уровня гнездования.

Быстрое: возможно, нет, конечно, не значительно. Что более важно, ИМХО, насколько читаемым является код. Это, конечно, вопрос мнения. Лично я думаю, что это немного более читаемо, чем ваш исходный код.

+0

Спасибо, похоже, что это работает. Я собираюсь проверить, работает ли он быстрее моего кода. – nicoco

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

  • Нет связанных вопросов^_^