2016-03-21 4 views
1

Я пытаюсь оптимизировать код здесь.оптимизировать количество сравнений

if ns=='8': 
    for i in nodes: 
     if '02' == i[-2:]: 
      d[i]='quorum-manager' 
     if '05' == i[-2:]: 
      d[i]='quorum-manager' 
     if '06' == i[-2:]: 
      d[i]='quorum-manager' 
     if '09' == i[-2:]: 
      d[i]='quorum-manager' 

Выше i список имен узлов, например:

i = ['xyz01', 'xyz02', 'xyz03', ...] 

Если узлы заканчиваются 02 или 05 или 06 или 09, я иду вперед и заменить словарные значения для тех, имена конкретных узлов.

Можно ли что-то вроде:

, если имя узла заканчивается в 02 или 05 или 06 или 09 заменить repective значения в словаре в одном кадре вместо сравнения в каждой строке, а затем заменить

+0

Это выглядит родственный: http://stackoverflow.com/questions/36125124/more-efficient-use-of-python-dictionary – Lafexlos

+0

Вы пытаетесь оптимизировать этот код - потому что профилирование сказал вам что сравнения дороги? Не пытайтесь оптимизировать код без измерения. – Daenyth

+2

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

ответ

4

Если у вас есть список строк, i[-2:] может быть, просто использовать in оператор:

if ns=='8': 
    for i in nodes: 
     if i[-2:] in ('02', '05', '06', '09'): 
      d[i]='quorum-manager' 
2

You следует искать последнюю часть i в наборе:

for i in nodes: 
    if i[-2:] in {"02","05","06","09"}: 
     d[i] = 'quorum-manager' 

Поиск неоднократно в списке (как и в других ответов) медленно, и просто плохая практика в целом. Обозначение скобки {...} поддерживается для python 2.7 и более поздних версий; вы также можете определить такой набор: set(["02","05","06","09"]). Если вы будете делать это много, вы можете заранее наработать наборы эквивалентных опций и использовать их повторно.

Более общий совет: если у вас есть целый ряд несвязанных тестов, которые приводят к тому же действию, вы бы написать один if несколько тестов, связанных с or.

# Imaginary example 
if i.endswith("02") or i.endswith("z03") or i[:2] == "xy": 
    d[i]='quorum-manager' 
+0

используйте '{" 02 "," 05 "," 06 "," 09 "}' в Python 3 и '(« 02 »,« 05 »,« 06 »,« 09 »)' в Python 2 вместо этого, иначе это не оптимизация: D –

+0

Спасибо. Я пошел на объяснение, но мог бы использовать постоянный синтаксис. (Требуется Python 2.7+.) – alexis

+0

в Python 2.7 '(« 02 »,« 05 »,« 06 »,« 09 »)' быстрее, потому что оптимизатор глазок не оптимизирует '{" 02 "," 05 "," 06 "," 09 "}' в константы. –

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