पहली समस्यादो मेथेमेटिका में अजीब दक्षता समस्याओं
मैं समय समाप्त हो गया है कि कब तक यह निम्नलिखित बयानों (जहां वी [x] एक समय गहन समारोह कॉल है) की गणना करने के लेता है:
Alice = Table[V[i],{i,1,300},{1000}];
Bob = Table[Table[V[i],{i,1,300}],{1000}]^tr;
Chris_pre = Table[V[i],{i,1,300}];
Chris = Table[Chris_pre,{1000}]^tr;
ऐलिस , बॉब और क्रिस समान मैट्रिक 3 अलग-अलग तरीकों की गणना करते हैं। मुझे लगता है कि ऐलिस और बॉब की तुलना में क्रिस की तुलना 1000 गुना तेज है।
यह आश्चर्य की बात नहीं है कि ऐलिस की गणना 1000 गुना धीमी है क्योंकि, मूर्खतापूर्ण, फ़ंक्शन वी को क्रिस की गणना के मुकाबले 1000 गुना अधिक कहा जाना चाहिए। लेकिन यह आश्चर्य की बात है कि बॉब इतना धीमा है, क्योंकि उसे की गणना क्रिस को छोड़कर क्रिस को मध्यवर्ती चरण Chris_pre स्टोर करती है।
बॉब इतनी धीमी गति से मूल्यांकन क्यों करता है?
दूसरी समस्या
मान लीजिए मैं फार्म के मेथेमेटिका में एक समारोह को संकलित करना चाहते
f(x)=x+y
जहां "y" एक निरंतर संकलन समय पर तय हो गई है (लेकिन जो मैं नहीं करना पसंद करते हैं सीधे कोड में इसके संख्यात्मक रूप से प्रतिस्थापित करें क्योंकि मैं इसे आसानी से बदल सकता हूं)। यदि y का वास्तविक मान y = 7.3 है, और मैं
f1=Compile[{x},x+y]
f2=Compile[{x},x+7.3]
परिभाषित करता है तो f1 f2 से 50% धीमी गति से चलाता है। एफ 1 संकलित होने पर मैथमैटिका "7.3" को "7.3" के साथ कैसे बदल सकता है, ताकि f1 f2 जितनी जल्दी हो सके?
संपादित करें:
मैं दूसरी समस्या के लिए एक बदसूरत वैकल्पिक हल मिल गया:
f1=ReleaseHold[Hold[Compile[{x},x+z]]/.{z->y}]
एक बेहतर तरीका होना चाहिए ...
वाह, बहुत बहुत धन्यवाद! यही वह है जिसकी तलाश में मैं हूं। (और मैं भविष्य में इस तरह की समस्याओं को अलग-अलग पोस्ट करना सुनिश्चित कर दूंगा।) –
'साथ' का उपयोग करना शायद समस्या से निपटने का सबसे सुरक्षित तरीका है, क्योंकि यह अपने शरीर के किसी भी मूल्यांकन से पहले वास्तविक शब्दावली प्रतिस्थापन करता है। –
@ माइकल पिलैट: सहमत हुए। मैंने सुझाव दिया है कि यदि आप पहले से ही 'y' परिभाषित कर चुके हैं, तो त्वरित और गंदे दृष्टिकोण की भावना में मूल्यांकन करें, लेकिन अस्थायी अतिरिक्त चर निश्चित रूप से सुरक्षित है। – Cascabel