лямбда против оператора.attrgetter ('xxx') как функция ключа сортировки в Python


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

Если бы вы изменили seq.sort(lambda x,y: cmp(x.xxx, y.xxx)), что предпочтительнее:

seq.sort(key=operator.attrgetter('xxx'))

Или:

seq.sort(key=lambda a:a.xxx)

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

1 19

1 ответ:

" внесение изменений в существующий код, который работает " - это то, как развиваются программы;-). Напишите хорошую батарею тестов, которые дают известные результаты с существующим кодом, сохраните эти результаты (которые обычно известны как "золотые файлы" в контексте тестирования); затем внесите изменения, повторно запустите тесты и убедитесь (в идеале автоматизированным способом), что единственные изменения в результатах тестов-это те, которые специально предназначены, чтобы быть там-никаких нежелательных или неожиданных побочных эффектов. Можно использовать и больше сложные стратегии обеспечения качества, конечно, но это суть многих подходов "интеграционного тестирования".

Что касается двух способов написания простой функции key=, цель проекта состояла в том, чтобы сделать operator.attrgetter быстрее, будучи более специализированным, но, по крайней мере, в текущих версиях Python нет измеримой разницы в скорости. В таком случае, для этой особой ситуации я бы рекомендовал lambda, просто потому, что он более лаконичен и обобщен (и я обычно не любитель лямбды, имейте в виду!- ).