Разборка говорит вам, что никаких магических оптимизаций здесь не применялось, это просто сокращение по сравнению с геном xpr.Похоже, Python справляется с этой задачей, даже если он вас удивляет.
>>> import dis
>>> dis.dis(f3)
5 0 LOAD_GLOBAL 0 (reduce)
3 LOAD_GLOBAL 1 (operator)
6 LOAD_DEREF 1 (d)
9 LOAD_CONST 1 (1)
12 BINARY_SUBTRACT
13 CALL_FUNCTION 1
16 LOAD_CLOSURE 0 (x)
19 BUILD_TUPLE 1
22 LOAD_CONST 2 (<code object <genexpr> at 0x7f32d325f830, file "<stdin>", line 5>)
25 MAKE_CLOSURE 0
28 LOAD_GLOBAL 2 (xrange)
31 LOAD_FAST 1 (y)
34 CALL_FUNCTION 1
37 GET_ITER
38 CALL_FUNCTION 1
41 CALL_FUNCTION 2
44 RETURN_VALUE
Если вы посмотрите на ваш вызов f5(2,4)
, он не выполняет так много операций, на самом деле:
>>> counter = 0
>>> def adder(x, y):
... global counter
... counter += 1
... return x + y
...
>>> def op(d):
... if d <= 1: return adder
... return lambda x,y:reduce(op(d-1),(x for i in xrange(y)))
...
>>> op(5)(2,4)
32317006071311007300714876688669951960444102669715484032130345427524655138867890893197201411522913463688717960921898019494119559150490921095088152386448283120630877367300996091750197750389652106796057638384067568276792218642619756161838094338476170470581645852036305042887575891541065808607552399123930385521914333389668342420684974786564569494856176035326322058077805659331026192708460314150258592864177116725943603718461857357598351152301645904403697613233287231227125684710820209725157101726931323469678542580656697935045997268352998638215525166389437335543602135433229604645318478604952148193555853611059596230656L
>>> counter
65035
>>> counter = 0
>>> op(3)(4,100)
>>> counter
297
65 тыс. Дополнений, не говоря уже о 297 для возведения в степень, даже не стоит говорить о том, когда речь идет о смешно оптимизированных современных процессорах, поэтому неудивительно, что это заканчивается в мгновение ока.Попробуйте увеличить один из аргументов, чтобы увидеть, как это быстро выходит за границы быстрой оценки очень .
Кстати, operator
- это встроенный модуль, и вы не должны называтьваши собственные функции, как это.