python - ये दो कार्य अलग क्यों हैं?




python-2.7 bytecode (2)

इस पर एक नजर डालिए:

>>> def f():
...     return (2+3)*4
... 
>>> dis(f)
  2           0 LOAD_CONST               5 (20)
              3 RETURN_VALUE  

जाहिर है, कंपाइलर का प्री-मूल्यांकन (2+3)*4 , जो समझ में आता है।

अब, अगर मैं बस * के संचालन के क्रम को बदलता हूं:

>>> def f():
...     return 4*(2+3)
... 
>>> dis(f)
  2           0 LOAD_CONST               1 (4)
              3 LOAD_CONST               4 (5)
              6 BINARY_MULTIPLY     
              7 RETURN_VALUE  

अभिव्यक्ति अब पूरी तरह से पूर्व मूल्यांकन नहीं है! इसका कारण क्या है? मैं सीपीथन 2.7.3 का उपयोग कर रहा हूँ।


ऐसा लगता है कि इस मुद्दे को पायथन 3.3 में पैच किया गया था, जैसा कि here देखा जा सकता here

>>> def f():
...     return (2+3)*4
... 
>>> dis(f)
  2           0 LOAD_CONST               5 (20)
              3 RETURN_VALUE  
>>> def f():
...     return 4*(2+3)
... 
>>> dis(f)
  2           0 LOAD_CONST               5 (20)
              3 RETURN_VALUE 

पहले मामले में unoptimized कोड LOAD 2 LOAD 3 ADD LOAD 4 MULTIPLY और दूसरे मामले में यह LOAD 4 LOAD 2 LOAD 3 ADD MULTIPLYfold_binops_on_constants() में पैटर्न मैचर को पहले ADD ठीक ( LOAD LOAD ADD साथ LOAD LOAD LOAD ADD बदलना fold_binops_on_constants() को संभालना होगा और उसके बाद एक ही चीज़ को MULTIPLY करने के लिए पालन करना होगा। दूसरे मामले में जब ADD (अब पहले के बजाय MULTIPLY लिए दूसरा तर्क) स्थिर हो गया है तो LLM देखने के लिए स्कैनर बहुत दूर है (जब "कर्सर" LOAD 4 पर था तो यह नहीं देखा अभी तक एक LLM तरह)।







cpython