बनाम मैंने देखा है कि अजगर में वहाँ एक संख्या का निरपेक्ष मान को खोजने के लिए इसी तरह के दो देख तरीके हैं:अजगर - पेट fabs
पहले
abs(-5)
दूसरा
import math
math.fabs(-5)
कैसे कर ये विधियां अलग हैं?
बनाम मैंने देखा है कि अजगर में वहाँ एक संख्या का निरपेक्ष मान को खोजने के लिए इसी तरह के दो देख तरीके हैं:अजगर - पेट fabs
पहले
abs(-5)
दूसरा
import math
math.fabs(-5)
कैसे कर ये विधियां अलग हैं?
math.fabs()
अगर यह कर सकता है तो यह बहस करने के लिए अपने तर्क को परिवर्तित करता है (यदि यह नहीं हो सकता है, तो यह अपवाद फेंकता है)। यह पूर्ण मूल्य लेता है, और परिणाम को एक फ्लोट के रूप में देता है।
फ्लोट के अलावा, abs()
भी पूर्णांक और जटिल संख्याओं के साथ काम करता है। इसका रिटर्न प्रकार इसके तर्क के प्रकार पर निर्भर करता है।
In [7]: type(abs(-2))
Out[7]: int
In [8]: type(abs(-2.0))
Out[8]: float
In [9]: type(abs(3+4j))
Out[9]: float
In [10]: type(math.fabs(-2))
Out[10]: float
In [11]: type(math.fabs(-2.0))
Out[11]: float
In [12]: type(math.fabs(3+4j))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/alexei/<ipython-input-12-8368761369da> in <module>()
----> 1 type(math.fabs(3+4j))
TypeError: can't convert complex to float
math.fabs()
हमेशा नाव देता है, जबकि abs()
पूर्णांक वापस आ सकते हैं।
' abs' को परिभाषित करता है, उस प्रकार के '__abs__' विशेष विधि के आधार पर किसी भी प्रकार का लौटा सकता है। – agf
संपादित करें: के रूप में @aix का सुझाव दिया, एक बेहतर (अधिक निष्पक्ष) जिस तरह से गति अंतर की तुलना करने के:
In [1]: %timeit abs(5)
10000000 loops, best of 3: 86.5 ns per loop
In [2]: from math import fabs
In [3]: %timeit fabs(5)
10000000 loops, best of 3: 115 ns per loop
In [4]: %timeit abs(-5)
10000000 loops, best of 3: 88.3 ns per loop
In [5]: %timeit fabs(-5)
10000000 loops, best of 3: 114 ns per loop
In [6]: %timeit abs(5.0)
10000000 loops, best of 3: 92.5 ns per loop
In [7]: %timeit fabs(5.0)
10000000 loops, best of 3: 93.2 ns per loop
In [8]: %timeit abs(-5.0)
10000000 loops, best of 3: 91.8 ns per loop
In [9]: %timeit fabs(-5.0)
10000000 loops, best of 3: 91 ns per loop
तो ऐसा लगता है abs()
केवल पूर्णांकों के लिए fabs()
से अधिक मामूली गति लाभ दिया है। फ्लोट्स के लिए, abs()
और fabs()
समान गति प्रदर्शित करते हैं।
In [1]: %timeit abs(-5)
10000000 loops, best of 3: 102 ns per loop
In [2]: import math
In [3]: %timeit math.fabs(-5)
10000000 loops, best of 3: 194 ns per loop
तो abs()
math.fabs()
की तुलना में तेजी है:
@aix क्या कहा गया है के अलावा, विचार करने के लिए एक और बात गति का अंतर है।
आप सेब से सेब की तुलना नहीं कर रहे हैं। निश्चित रूप से 'गणित आयात fabs' से' का उपयोग करें, और दोनों के लिए '-5.0' आज़माएं। – agf
@agf इसे इंगित करने के लिए धन्यवाद! वह मेरा गूंगा था। –
भी अविश्वसनीय समय के परिणाम? आपके पास पहले 102ns पर abs (-5) था, फिर बाद में इसे 88.3ns के रूप में दिखाएं। कभी भी किसी भी बेंचमार्क के एक रन से निष्कर्ष निकालें, भले ही यह आंतरिक रूप से समय-समय पर मुद्दों से बचने का प्रयास करता है। –
abs()
: तर्क के अनुसार पूर्ण मूल्य देता है यानी अगर तर्क int है तो यह int लौटाता है, अगर तर्क फ़्लोट हो जाता है तो यह फ्लोट लौटाता है। यह भी जटिल चर पर काम करता है अर्थात abs(a+bj)
भी काम करता है और निरपेक्ष मूल्य यानी "math.sqrt (((क) ** 2) + ((ख) ** 2)"
math.abs()
रिटर्न: यह केवल काम करता है पूर्णांक या फ्लोट मानों पर। हमेशा पूर्ण फ़्लोट मान देता है चाहे तर्क प्रकार क्या हो।
'abs' केवल पूर्णांक और फ्लोट से कहीं अधिक काम करता है, और परिणाम प्रकार __not__ हमेशा तर्क के समान होता है, उदाहरण के लिए 'abs (3 + 4j)' – agf
'fabs' के बारे में एक टिप्पणी में अपनी हमेशा-फ्लोट प्रकृति के कारण अधिक समय लेना और आपको सही जवाब मिल गया है! –
@agf: जटिल संख्याओं के बारे में मुझे याद दिलाने के लिए धन्यवाद। ब्याज की, अन्य चीजें किस चीज '__builtin __। ab एस() 'सफलतापूर्वक लागू किया जा सकता है? – NPE