2012-05-27 11 views
87

बनाम मैंने देखा है कि अजगर में वहाँ एक संख्या का निरपेक्ष मान को खोजने के लिए इसी तरह के दो देख तरीके हैं:अजगर - पेट fabs

पहले

abs(-5) 

दूसरा

import math 
math.fabs(-5) 

कैसे कर ये विधियां अलग हैं?

उत्तर

109

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 
+3

'abs' केवल पूर्णांक और फ्लोट से कहीं अधिक काम करता है, और परिणाम प्रकार __not__ हमेशा तर्क के समान होता है, उदाहरण के लिए 'abs (3 + 4j)' – agf

+1

'fabs' के बारे में एक टिप्पणी में अपनी हमेशा-फ्लोट प्रकृति के कारण अधिक समय लेना और आपको सही जवाब मिल गया है! –

+0

@agf: जटिल संख्याओं के बारे में मुझे याद दिलाने के लिए धन्यवाद। ब्याज की, अन्य चीजें किस चीज '__builtin __। ab एस() 'सफलतापूर्वक लागू किया जा सकता है? – NPE

1

math.fabs() हमेशा नाव देता है, जबकि abs() पूर्णांक वापस आ सकते हैं।

+6

' abs' को परिभाषित करता है, उस प्रकार के '__abs__' विशेष विधि के आधार पर किसी भी प्रकार का लौटा सकता है। – agf

8

संपादित करें: के रूप में @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 क्या कहा गया है के अलावा, विचार करने के लिए एक और बात गति का अंतर है।

+3

आप सेब से सेब की तुलना नहीं कर रहे हैं। निश्चित रूप से 'गणित आयात fabs' से' का उपयोग करें, और दोनों के लिए '-5.0' आज़माएं। – agf

+0

@agf इसे इंगित करने के लिए धन्यवाद! वह मेरा गूंगा था। –

+0

भी अविश्वसनीय समय के परिणाम? आपके पास पहले 102ns पर abs (-5) था, फिर बाद में इसे 88.3ns के रूप में दिखाएं। कभी भी किसी भी बेंचमार्क के एक रन से निष्कर्ष निकालें, भले ही यह आंतरिक रूप से समय-समय पर मुद्दों से बचने का प्रयास करता है। –

0

abs(): तर्क के अनुसार पूर्ण मूल्य देता है यानी अगर तर्क int है तो यह int लौटाता है, अगर तर्क फ़्लोट हो जाता है तो यह फ्लोट लौटाता है। यह भी जटिल चर पर काम करता है अर्थात abs(a+bj) भी काम करता है और निरपेक्ष मूल्य यानी "math.sqrt (((क) ** 2) + ((ख) ** 2)"

math.abs() रिटर्न: यह केवल काम करता है पूर्णांक या फ्लोट मानों पर। हमेशा पूर्ण फ़्लोट मान देता है चाहे तर्क प्रकार क्या हो।