2010-11-04 4 views
1

Какой из двух альтернатив ниже эффективнее? Любые рекомендации по дальнейшему его улучшению?Управление контуром, что более эффективно

Вариант А:

for i in BAR_Items: 
    if BAR_Items[i] != A and SHAPE[i+"_SHP"] != A: continue 
    if i in Selection: 
     Selection.remove(i) 
     BAR_Items[i].clearActions() 
     BAR_Items[i].add(vizact.spinTo(axisAngle=[0,1,0,90],speed=300)) 
     VFrame.SetStatusText(frame, i + " has been deselected. "+ str(Selection)) 
    else: 
     Selection.append(i) 
     BAR_Items[i].add(vizact.spin(0,1,0,90,viz.FOREVER)) 
     VFrame.SetStatusText(frame, i + " selected. " + str(Selection)) 
    break 

Вариант B:

for i in BAR_Items: 
    if BAR_Items[i] == A or SHAPE[i+"_SHP"] == A: 
     if i in Selection: 
      Selection.remove(i) 
      BAR_Items[i].clearActions() 
      BAR_Items[i].add(vizact.spinTo(axisAngle=[0,1,0,90],speed=300)) 
      VFrame.SetStatusText(frame, i + " has been deselected. "+ str(Selection)) 
     else: 
      Selection.append(i) 
      BAR_Items[i].add(vizact.spin(0,1,0,90,viz.FOREVER)) 
      VFrame.SetStatusText(frame, i + " selected. " + str(Selection)) 
     break 

Хорошо, я последовал предложения и нашел способ его синхронизации. Измеряя его 500 раз, В (0,001279264 секунды) быстрее, чем А (0,001966169 секунд) в среднем (цифры являются средними).

+2

Когда вы их измеряли, что вы узнали? Пожалуйста, включите информацию о времени из их запуска. –

+0

@ S.Lott: @relima: Будет ли он работать даже за исключением особых обстоятельств? Использование индекса и элементов из списка является ошибочным. – pyfunc

+0

@pyfunc: «Будет ли он даже работать»? Очень важно. Все «более эффективные» вопросы должны включать метрики, чтобы показать, что (а) он фактически выполняется, и (б), который является более эффективным. –

ответ

3

Хорошо, это придуманный способ взглянуть на представление. Поскольку мы пытаемся увидеть разницу между использованием «продолжить» или вытащить код внутри «if block ..»

Вот небольшой эксперимент.

def f(): 
    x = {'a':'b', 'c':'d', 'e':'d'} 
    for l in x: 
     if x[l] != 'd': continue 
     print x 

def f1(): 
    x = {'a':'b', 'c':'d', 'e':'d'} 
    for l in x: 
     if x[l] == 'd': 
      print x  

import dis 
print dis.dis(f) 
print dis.dis(f1) 

Большинство операций такие же, а вот небольшая разница:

В случае F:

56 POP_TOP    
57 JUMP_ABSOLUTE   34 
60 JUMP_FORWARD    1 (to 64) 
63 POP_TOP    

64 LOAD_FAST    0 (x) 
67 PRINT_ITEM   
68 PRINT_NEWLINE  
69 JUMP_ABSOLUTE   34 
72 POP_BLOCK   
73 LOAD_CONST    0 (None) 
76 RETURN_VALUE 

В случае f1:

56 POP_TOP    

57 LOAD_FAST    0 (x) 
60 PRINT_ITEM   
61 PRINT_NEWLINE  
62 JUMP_ABSOLUTE   34 
65 POP_TOP    
66 JUMP_ABSOLUTE   34 
69 POP_BLOCK   
70 LOAD_CONST    0 (None) 
73 RETURN_VALUE 

Verdict

Только одно разность ОП. На самом деле не так. Есть эквивалент. Основывайте свое решение на читаемости, а не на производительности.

+0

My Bar_items - фактически словарь, который возвращает объект. A - объект, с которым он сравнивается. – relima

+0

@relima: О, я! – pyfunc

+0

Это потрясающе. Спасибо за такую ​​тяжелую работу. – relima

5

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

0

Для кода, в котором производительность не является абсолютно критичной, спросите себя, «что более понятно», и используйте это как свой ответ. Разница в несколько микросекунд просто не стоит тратить время на скрипт.

+1

Разница до сих пор заключалась в том, что моя программа уменьшала скорость обновления opengl от 90 кадров в секунду до 45 кадров в секунду из-за этой небольшой разницы. – relima

+0

Прямо сейчас, на сцене я, это не много неприятностей, но это наверняка повлияет на меня позже, когда я попытаюсь отобразить большее количество анимированных объектов. – relima

+0

@relima: вы действительно говорите, что добавив только оператор continue, вы повысили свою частоту обновления на 100%? Согласно ответу pyfunc различие - это единственный код операции. Даже миллионы раз я не вижу, как это могло бы иметь этот эффект. Несмотря на это, при выполнении критического кода производительности единственным ответом на «быстрее» является время, когда вы создаете собственный код. –

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