2017-12-18 41 views
5

मुझे एक कार्यक्रम में बहुत सारी लॉगरिदमिक गणनाओं का उपयोग करना होगा। लॉगरिदमिक आधार के संदर्भ में, प्रक्रिया विशिष्ट नहीं है। मैं सोच रहा था, अगर कोई आधार n (2? 10? ई?) पाइथन 3.5 math मॉड्यूल में दूसरों की तुलना में तेज़ है, क्योंकि होड के तहत अन्य सभी आधार alog_a(x) = log_n(x)/log_n(a) में परिवर्तित हो गए हैं। या आधार की पसंद गणना की गति को प्रभावित नहीं करती है, क्योंकि सभी आधारों को सी पुस्तकालय का उपयोग करके उसी तरह लागू किया जाता है?क्या पाइथन में लॉगरिदमिक गणना के लिए आधार गति को प्रभावित करता है?

+1

संभावित डुप्लिकेट [मैं पाइथन के गणित कार्यों का निरीक्षण कहां कर सकता हूं?] (Https://stackoverflow.com/questions/5476189/where-can-i-inspect-pythons-math-functions) –

+0

क्या आप 'numpy' का उपयोग कर रहे हैं या एक और पुस्तकालय? क्या आप वैक्टर/वेक्टरीकृत तरीकों का उपयोग कर काम करते हैं? – Jon

+0

आप स्वयं को कुछ बेंचमार्किंग करने का प्रयास कर सकते हैं, लेकिन आपके कोड के आधार पर यह संभावना है कि, यदि कोई अंतर भी है, तो यह बड़े पैमाने पर अन्य प्रकार के ओवरहेड द्वारा ग्रहण किया जाएगा। – jdehesa

उत्तर

4

CPython में, math.log आधार स्वतंत्र है, लेकिन मंच निर्भर है। C source for the math module से, 1 940-19 61 के लाइनों पर, math.log के लिए कोड दिखाया गया है। इसलिए जब तक सी log समारोह e के लिए एक विशेष जांच है, यह एक ही गति से चलेंगे

math_log_impl(PyObject *module, PyObject *x, int group_right_1, 
      PyObject *base) 
/*[clinic end generated code: output=7b5a39e526b73fc9 input=0f62d5726cbfebbd]*/ 

{ 
    PyObject *num, *den; 
    PyObject *ans; 

    num = loghelper(x, m_log, "log"); // uses stdlib log 
    if (num == NULL || base == NULL) 
     return num; 

    den = loghelper(base, m_log, "log"); // uses stdlib log 
    if (den == NULL) { 
     Py_DECREF(num); 
     return NULL; 
    } 

    ans = PyNumber_TrueDivide(num, den); 
    Py_DECREF(num); 
    Py_DECREF(den); 
    return ans; 
} 

यह, कोई बात नहीं क्या,, संख्या और आधार के प्राकृतिक लॉग गणना करता है।

यह स्रोत अन्य उत्तरों के log2 और log10 को log से तेज़ी से समझाता है। उन्हें क्रमशः मानक लाइब्रेरी log2 और log10 फ़ंक्शंस का उपयोग करके कार्यान्वित किया जाता है, जो तेज़ी से होंगे। हालांकि, इन कार्यों को प्लेटफ़ॉर्म के आधार पर अलग-अलग परिभाषित किया गया है।

नोट: मैं सी से बहुत परिचित नहीं हूं इसलिए मैं यहां गलत हो सकता हूं।

+1

मैं सी कोड की व्याख्या करने की स्थिति में नहीं हूं। लेकिन मैं इससे समझता हूं कि 'लॉग (एक्स), लॉग 2 (एक्स), लॉग 10 (एक्स)' में एक ही गति होनी चाहिए, क्योंकि वे एक ही सी लाइब्रेरी रणनीतियों का उपयोग करते हैं। और 'लॉग (एक्स, एन)' धीमा है, क्योंकि यह मेरे प्रश्न से लॉगरिदमिक सूत्र का उपयोग करता है। – MrT

+0

हां, यह सही है। –

2

दिलचस्प सवाल। मैंने कुछ "अच्छा पुराना" फील्ड टेस्ट किया था (लिनक्स पर सीपीथन 3.6.2, x86_64, i7-3740QM सीपीयू - इस सीपीयू के लिए उपलब्ध सभी अनुकूलन के साथ पाइथन दुभाषिया संकलित)।

>>> math.log10(3) 
0.47712125471966244 
>>> math.log(3, 10) 
0.47712125471966244 
>>> timeit.timeit('math.log(3, 10)', setup = 'import math') 
0.2496643289923668 
>>> timeit.timeit('math.log10(3)', setup = 'import math') 
0.14756392200069968 

लॉग 10 लॉग (एन, 10) से स्पष्ट रूप से तेज़ है।

>>> math.log2(3.0) 
1.584962500721156 
>>> math.log(3.0, 2.0) 
1.5849625007211563 
>>> timeit.timeit('math.log2(3.0)', setup = 'import math') 
0.16744944200036116 
>>> timeit.timeit('math.log(3.0, 2.0)', setup = 'import math') 
0.22228705599263776 

लॉग 2 लॉग (एन, 2) से भी स्पष्ट रूप से तेज़ है। बीटीडब्ल्यू, किसी भी तरह से, फ्लोट्स और इन्स समान रूप से तेज़ होते हैं।

numpy के साथ, चित्र अलग है। यह एक तरह से कोई फर्क नहीं पड़ता कि आप क्या करते:

>>> timeit.timeit('numpy.log(numpy.arange(1, 10))', setup = 'import numpy') 
2.725074506000965 
>>> timeit.timeit('numpy.log10(numpy.arange(1, 10))', setup = 'import numpy') 
2.613872367001022 
>>> timeit.timeit('numpy.log2(numpy.arange(1, 10))', setup = 'import numpy') 
2.58251854799164 
संबंधित मुद्दे

 संबंधित मुद्दे