Мені потрібна наступна функція:
Вхід : alist
Вихід :
Trueякщо всі елементи у вхідному списку оцінюють як рівні між собою за допомогою стандартного оператора рівності;Falseінакше.
Продуктивність : звичайно, я вважаю за краще не зазнавати зайвих накладних витрат.
Я вважаю, що найкраще:
- повторити список
- порівняйте сусідні елементи
- і
ANDвсі отримані булеві значення
Але я не впевнений, який найбільш піфонічний спосіб це зробити.
Відсутність функції короткого замикання завдає шкоди лише довгому входу (понад ~ 50 елементів), у якого на початку є нерівні елементи. Якщо це трапляється досить часто (як часто залежить від того, як довго можуть бути списки), потрібне коротке замикання. Найкращим алгоритмом короткого замикання здається @KennyTM checkEqual1. Однак вона платить за це значні витрати:
- до 20-кратного виконання майже однакових списків
- до 2,5х показників у коротких списках
Якщо довгі входи з ранніми нерівними елементами не трапляються (або трапляються досить рідко), коротке замикання не потрібно. Тоді, безумовно, найшвидшим є рішення @Ivo van der Wijk.
functools.reduce(operator.eq, a)що не було запропоновано.
a == bабо однакові, як уa is b?