То, что у вас есть, вероятно, столь же эффективно, как вы собираетесь получить для этого мысленного эксперимента (очевидно, python уже вычисляет и сохраняет длину для объектов LIST, которые можно получить с помощью встроенной функции len (), поэтому функция совершенно не нужна).
Вы можете получить более короткий код, если хотите:
def count(L):
return count(L[:-1])+1 if L else 0
Но вам все равно нужно изменить предел рекурсии python.
import sys; sys.setrecursionlimit(100000)
Однако следует отметить, что в большинстве случаев для обработки операторов «if else» требуется больше времени, чем для «try except». Следовательно, «попробовать, кроме» будет лучше (если вам нужна производительность). Конечно, это странно говорить о производительности, потому что рекурсия обычно не работает очень хорошо из-за того, как python управляет пространствами имен и тому подобным. Рекурсия обычно не одобряется, она ненужна и медленна. Итак, попытка оптимизировать производительность рекурсии немного странно.
Последнее замечание. Вы упоминаете, что temp = arr [i] занимает память. Да, возможно, несколько байтов. Конечно, любое вычисление, которое вы выполняете, чтобы определить, имеет ли arr элемент в i, займет несколько байтов в памяти даже при простом запуске arr [i] без присваивания. Кроме того, эти байты освобождаются, когда временная переменная выпадает из области видимости, используется повторно или функция завершается. Следовательно, если вы не планируете запускать 10 000 000 000 подпроцессов, будьте уверены, что при использовании такой временной переменной не произойдет снижения производительности.