Форум сайта python.su
43
4kptтут нить обрывается(как событие может производить действия? вне функции??), и понять чем примечательна рекурсия в хуках невозможно.
производит опреедленные действия
Рекурсия плоха тем (как уже заметили), что самовызов функции серьезно нагружает машину.проведем эксперимент с теми же вложенными списками:
f = lambda ls: reduce(lambda res, x: res+[x] if not isinstance(x,list) else res + f(x),ls,[])
def flatten(src_ls): res = [] def make_flat(ls): for elt in ls: make_flat(elt) if (isinstance(elt,list)) else res.append(elt) make_flat(src_ls) return res
def hardcore(ls): res = [] nested_elements = [] positions = [] for elt in ls: if isinstance(elt,list): nested_elements.append(elt) else: res.append(elt) idx = None offset = 0 while nested_elements: nested_ls = nested_elements.pop() if positions: idx = positions.pop() got_nested = False for nested_elt in nested_ls: if isinstance(nested_elt, list): nested_elements.append(nested_elt) positions.append(len(res)-offset) got_nested = True else: if got_nested: offset += 1 if idx: res.insert(idx,nested_elt) idx += 1 else: res.append(nested_elt) return res
%%timeit f([1,[2,3,4,[5,[6],7,8],9],10,11,[12,[13]]]) 100000 loops, best of 3: 8.07 us per loop %%timeit flatten([1,[2,3,4,[5,[6],7,8],9],10,11,[12,[13]]]) 100000 loops, best of 3: 5.48 us per loop %%timeit hardcore([1,[2,3,4,[5,[6],7,8],9],10,11,[12,[13]]]) 100000 loops, best of 3: 8.38 us per loop
Офлайн
75
4kptА какие у вас характеристики компютера?
серьезно нагружает машину
Офлайн
14
Singularity, под “серьезно нагружает” имелось в виду относительно цикла.
Офлайн
18
sergeek
Как видно, помимо нехилого оверхеда вариант с циклом к тому же тормознее и жруч на память скорей всего. Так что профит рекурсии всеобъемлющ
def recur(n): ... if not n == 0: ... hardwork() ... recur(n - 1)
def loop(n): for i in range(n): hardwork()
>>> timeit.timeit('req(10)','from __main__ import req') 10.308371383998747 timeit.timeit('loop(10)','from __main__ import loop') 6.014963355999498
sergeekКак?! IronPython вроде так умеет, как запилить на обычном, может какой декоратор есть из библиотеки?
%%timeit
Офлайн
43
adrayя ведь писал выше, что рекурсия эта полезна для обработки данных с рекурсивным устройством. Для плоских структур конечно же лучше применить цикл.
…
%%timeitэто просто magic function из IPython шелла
Офлайн
43
adrayОк, понял вы видимо считаете IronPython это и есть IPython, но это не так. А зачем оно надо? Стандартный шелл расширяем, его и расширили в IPython, если так надо именно в обычном - можете посмотреть в исходниках как оно делается
Как?! IronPython вроде так умеет, как запилить на обычном, может какой декоратор есть из библиотеки?

Офлайн
63
“как событие может производить действия? вне функции??”
Не придерайся к словам. Я имел ввиду, что вызывается, например, дополнительное графическое окно для ввода или выбора данных. Потом это окно (блин на событие из окна) вешается эта же фукция (вызов функции), но уже повторно обрабатывается с новым значеним параметра вызова. Делается это что-бы не писать на обрабоки событий отдельных функций… Получаестя (формально) рекурсия.
Отредактировано 4kpt (Ноя. 10, 2012 01:47:48)
Офлайн