python तर्क अनपॅकिंग अपशिष्ट ढेर फ्रेम्स




0 Answers

python recursion cpython python-internals

जब तर्क को अनपॅक करके फ़ंक्शन कहा जाता है, तो यह दो बार रिकर्सन गहराई को बढ़ाता है। मैं जानना चाहता हूं कि ऐसा क्यों होता है।

सामान्य रूप से:

depth = 0

def f():
    global depth
    depth += 1
    f()

try:
    f()
except RuntimeError:
    print(depth)

#>>> 999

एक अनपॅकिंग कॉल के साथ:

depth = 0

def f():
    global depth
    depth += 1
    f(*())

try:
    f()
except RuntimeError:
    print(depth)

#>>> 500

सिद्धांत में दोनों को लगभग 1000 तक पहुंचना चाहिए:

import sys
sys.getrecursionlimit()
#>>> 1000

यह सीपीथन 2.7 और सीपीथन 3.3 पर होता है।

पीपीपी 2.7 और पीपीपी 3.3 पर एक अंतर है, लेकिन यह बहुत छोटा है (1480 बनाम 13 9 5 और 1526 बनाम 13 9 5)।

जैसा कि आप अलग-अलग हिस्सों से देख सकते हैं, कॉल के प्रकार के अलावा दोनों के बीच थोड़ा अंतर होता है ( CALL_FUNCTION बनाम CALL_FUNCTION_VAR ):

import dis
def f():
    f()

dis.dis(f)
#>>>  34           0 LOAD_GLOBAL              0 (f)
#>>>               3 CALL_FUNCTION            0 (0 positional, 0 keyword pair)
#>>>               6 POP_TOP
#>>>               7 LOAD_CONST               0 (None)
#>>>              10 RETURN_VALUE
def f():
    f(*())

dis.dis(f)
#>>>  47           0 LOAD_GLOBAL              0 (f)
#>>>               3 BUILD_TUPLE              0
#>>>               6 CALL_FUNCTION_VAR        0 (0 positional, 0 keyword pair)
#>>>               9 POP_TOP
#>>>              10 LOAD_CONST               0 (None)
#>>>              13 RETURN_VALUE



Related