Лучшая методика оптимизации с использованием if / else или словаря

Что лучше оптимизировать?

  • Ряд оператора if / else, который получает строку, возвращает соответствующую ему функцию. (Около 40-50 утверждений if / else).
  • Словарь, поддерживающий пару ключ-значение. ключ как строки и значения как объекты функции, а также одну основную функцию для поиска и возврата объекта функции.

Основная функция, которая фактически возвращает объект функции с использованием вышеуказанного метода, будет называться миллионы или миллиарды раз, поэтому нужно делать это разумно. Что может быть лучше?

Например, для

dict['str1'] = func1 dict['str2'] = func2 and so on.. def main_func(str): return dict[str] 

Или

 def main_func(str): if 'str1': return func1 elif 'str2': return func2 

Что было бы лучше …? если у нас есть 50-60 таких строк, и этот процесс должен быть миллиардами раз.

Хранение функционального объекта внутри словаря, в самой функции: –

 def func1(): if dict.has_key('str1'): dict['str1'] = func1 -- do something -- 

Что лучше, это или выше. Это выглядит намного чище. Но помните, что эти функции будут вызываться много раз, поэтому функция has_key также будет вызываться много раз.

благодаря

5 Solutions collect form web for “Лучшая методика оптимизации с использованием if / else или словаря”

Выберите словарь.

Словарь …

  • встроен
  • является питоническим
  • требует меньше кода шаблона
  • имеет сложность O (1) по сравнению с линейной сложностью O (n) if-else
  • не виновен в преждевременной пессимизации (у нас недостаточно оснований полагать без профилирования, что это менее эффективный метод с большим отрывом)

Я бы предложил написать решение, используя сначала словарь, и посмотреть, достаточно ли решение для ваших нужд. Если так, отлично, все готово. Если нет, время это против другого.

Рассмотрим такое решение (которое вернет None если строка не найдена):

 func_dict = {} func_dict['str1'] = fun1 func_dict['str2'] = fun2 ... def function_lookup(func_string): return func_dict.get(func_string) 

Затем, в основном, просто напишите function_lookup(whatever_string_variable) чтобы попытаться выполнить поиск вашей функции. Это позволяет избежать переустановки словаря при каждом вызове function_lookup .

Словарь будет быстрее: он приблизительно равен O (1), а цепочка операторов if – O (n). Чтобы продемонстрировать, этот скрипт ( make_test.py ) выведет скрипт python, который запускает некоторые тестовые тесты:

 ifs = [] dict = [] for i in range(60): string = 'str%d' % i ifs.append(' %sif str == "%s": return %d' % ('el' if i else '', string, i)) dict.append('"%s": %d' % (string, i)) print 'dict = {', ','.join(dict), '}' print 'def with_dict(str):' print ' return dict[str]' print 'def with_if(str):' print '\n'.join(ifs) print ''' import timeit def test_dict(): for i in range(60): with_dict("str%d" % i) def test_if(): for i in range(60): with_if("str%d" %i) print 'dict:', timeit.timeit(test_dict, number=10000) print 'if: ', timeit.timeit(test_if, number=10000)''' 

Запуск его, как python make_test.py | python python make_test.py | python , дает мне:

 dict: 0.706176042557 if: 1.67383503914 

То есть версия if более чем в 2 раза медленнее, чем версия dict .

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

В любом случае разница, вероятно, не будет огромной в любом случае. Конечно, решение хеш-таблицы чище, поэтому я рекомендовал бы это.

Лучший способ узнать наверняка – написать обе версии и проверить их с большим количеством данных и измерить их производительность.

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

Словарь лучше. Словарь должен поддерживаться деревом / хэшмапом и имеет более сложную временную сложность, чем оператор if-else (что примерно линейно). Даже если фактическое время выполнения не лучше, код будет более чистым со словарем.

  • Обратный путь Хэмминга
  • Моя реализация слияния двух отсортированных списков в линейном времени - что можно улучшить?
  • Проверьте, равно ли два вложенных списка при замене
  • Организуйте 3D-точки и найдите их на расстоянии от позиции
  • Создайте иерархию из словаря списков
  • Найти минимальное неотрицательное целое число, которое не удовлетворяет условию
  • Итеративный или ленивый выбор проб
  • Создание подписок из списка элементов списка
  • Python - лучший язык программирования в мире.