Я подумал, что было бы интересно указать, какие методы являются самыми быстрыми и в каком сценарии:
Вот несколько тестов, которые я провел (на MacBook Pro 2012 года)
>>> def method1(list,search_age):
... for name,age in list.iteritems():
... if age == search_age:
... return name
...
>>> def method2(list,search_age):
... return [name for name,age in list.iteritems() if age == search_age]
...
>>> def method3(list,search_age):
... return list.keys()[list.values().index(search_age)]
Результаты profile.run()
для каждого метода 100000 раз:
Метод 1:
>>> profile.run("for i in range(0,100000): method1(list,16)")
200004 function calls in 1.173 seconds
Метод 2:
>>> profile.run("for i in range(0,100000): method2(list,16)")
200004 function calls in 1.222 seconds
Метод 3:
>>> profile.run("for i in range(0,100000): method3(list,16)")
400004 function calls in 2.125 seconds
Таким образом, это показывает, что для небольшого требования метод 1 является самым быстрым.Это, скорее всего, потому что он возвращает первое совпадение, в отличие от всех совпадений, таких как метод 2 (см. Примечание ниже).
Интересно, что те же самые тесты, которые у меня есть, выполняются с 2700 записямиЯ получаю совершенно разные результаты (на этот раз 10000 раз):
Метод 1:
>>> profile.run("for i in range(0,10000): method1(UIC_CRS,'7088380')")
20004 function calls in 2.928 seconds
Метод 2:
>>> profile.run("for i in range(0,10000): method2(UIC_CRS,'7088380')")
20004 function calls in 3.872 seconds
Метод 3:
>>> profile.run("for i in range(0,10000): method3(UIC_CRS,'7088380')")
40004 function calls in 1.176 seconds
Итак, метод 3 намного быстрее .Показывает, что размер вашего dict будет влиять на выбранный вами метод.
Примечания: Метод 2 возвращает список всех имен, тогда как методы 1 и 3 возвращают только первое совпадение.Я не рассматривал использование памяти.Я не уверен, что метод 3 создает 2 дополнительных списка (keys () и values ()) и сохраняет их в памяти.