2012-01-15 3 views
1

Я понимаю, что петли - плохая идея в python, и я должен их избегать.избегая циклов в python

Ну, у меня есть несколько из тех, кого я хочу избежать.

У меня есть список вещей с именем липида:

class bead: 
    x = 0 
    y = 0 
    z = 0 
    LID = 0 
    t = 0 

class lipid: 
    h = bead() 
    b = bead() 
    t = bead() 
    LID = 0 

и я делаю следующее (код ниже):

  1. инициализации 2d массив h собирается над всеми липидами и
  2. определить, считаются ли они U или
  3. , добавив значение к соответствующему h

Как я могу избежать, по крайней мере, первого цикла?

1:

class h: 
    cU = 0 
    cD = 0 
    hU = 0 
    hD = 0 
    h = 0 

    for i in range(0,8): 
     hs.append([]) 
     for j in range(0,8): 
      index = (i,j) 
      hn = h() 
      hs[i].append(hn) 

2 и 3:

for LID in lipids: 
     l = lipids[LID] 
     up = l.h.z > l.t.z 
     X = (int)(l.b.x*8/L) 
     Y = (int)(l.b.y*8/L) 
     Z = (l.b.z)*0.5 
     if up: 
      hs[X][Y].hU += Z 
      hs[X][Y].cU += 1 
     else: 
      hs[X][Y].hD += Z 
      hs[X][Y].cD += 1 
+6

Кто сказал, что петли плохи? – ThiefMaster

+4

'Я понимаю, что петли - плохая идея в питоне, и я должен избегать их.' - wat? Откуда у вас эта идея? Итерация поощряется по поводу рекурсии. Теперь довольно много * простых * 'for' циклов можно заменить синтаксическим сахаром (способы сделать то же самое с лучшим исходным кодом). Но это лучший способ писать циклы. – delnan

ответ

7

Loops не плохая идея. Именно этот код с интенсивным циклом может быть медленным. Но это ничего особенного для циклов, это просто, что Python не так быстро, как другие языки. Я предлагаю вам не избегать циклов, если они являются наиболее естественным выражением вашего алгоритма. Если ваш код оказывается медленнее того, что вы ожидаете или нуждаетесь, тогда ищите способы его оптимизации (профилирование, для начала).

article Об анализе алгоритмов в Википедии, возможно, я буду полезен для вас.

+3

Даже «цикл с интенсивным циклом может быть медленным» не имеет большого смысла. Если ваш алгоритм O (n), он будет O (n), независимо от того, является ли цикл неявным или нет. И многим, ** многим ** задачам требуется некоторый O (n) алгоритм. Если вы нажмете цикл в оптимизированный код C, постоянные факторы немного ниже, но он все еще является циклом (хотя он * является * действительной оптимизацией, если вы так отчаянно). – delnan

+0

+1 к вашему комментарию @delnan. Я соответствующим образом редактирую свой ответ. – dsign

1

Пример того, как создать 2d массив списковых будет выглядеть следующим образом:

hs = [[h() for i in range(8)] for j in range(8)] 

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

Примечание: Как указано в комментарии, еще одно преимущество от понимания списка состоит в том, что они обычно обеспечивают лучшую производительность, чем петли for, и функцию map.

+4

_this не будет отличаться от написания для циклов, так как в списках понимаются синтаксические сахара ._ - Это неверно, ошибки в списках быстрее, чем цикл for, поскольку цикл реализован на уровне C, а не на уровне Python. Они также быстрее, чем функция map(). –

+0

@Lattyware Спасибо за ваш комментарий. Я изучил это, и, хотя вы в полной мере правы в большинстве случаев, кажется, что все еще есть некоторые из них, в которых «карта» быстрее, чем понимание списков, как описано [здесь] (http://stackoverflow.com/a/1247490/183066). – jcollado

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