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

with s (Col1, Col2) as (
select 'A', 1 from dual union all
select 'A', 2 from dual union all
select 'A', 3 from dual union all
select 'B', 1 from dual union all
select 'B', 2 from dual union all
select 'B', 3 from dual)
select col1, ltrim(sys_connect_by_path(col2, ','), ',') path
from s
start with col2 = 1
connect by prior col2 = col2 - 1 and prior col1 = col1;

C PATH
- ----------
A 1
A 1,2
A 1,2,3
B 1
B 1,2
B 1,2,3

6 rows selected.
28
задан martineau 12 August 2019 в 16:56
поделиться

2 ответа

Как указано предыдущими комментаторами, attrgetter немного быстрее, но для большого количества ситуаций различие является крайним (~microseconds).

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

Еще один протест состоит в том, что Ваш IDE должен быть в состоянии сигнализировать об опечатке на имени attr при использовании lambda, в отличие от использования attrgetter.

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

4
ответ дан 28 November 2019 в 03:39
поделиться

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

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

21
ответ дан 28 November 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: