Python-abs 대 fab


107

파이썬에는 숫자의 절대 값을 찾는 두 가지 유사한 방법이 있음을 알았습니다.

먼저

abs(-5)

둘째

import math
math.fabs(-5)

이 방법은 어떻게 다릅니 까?

답변:


127

math.fabs()가능한 경우 인수를 float로 변환합니다 (할 수없는 경우 예외가 발생 함). 그런 다음 절대 값을 취하고 결과를 부동 소수점으로 반환합니다.

부동 소수점 외에도 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/npe/<ipython-input-12-8368761369da> in <module>()
----> 1 type(math.fabs(3+4j))

TypeError: can't convert complex to float

4
abs정수 및 부동 소수점 이상으로 작동하며 결과 유형이 항상 인수와 동일 하지는 않습니다abs(3+4j) .
— agf

1
fabs항상 떠 다니는 특성으로 인해 더 오래 걸리는 것에 대한 의견을 추가 하면 정답이 있습니다!
— Patrick Perini

@agf : 복소수에 대해 알려 주셔서 감사합니다. 흥미롭게도 다른 어떤 클래스에 __builtin__.abs()성공적으로 적용될 수 있습니까?
— NPE

5
@aix __abs__매직 메소드 를 정의하는 사용자 정의 클래스
— agf

9

편집 : @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()비슷한 속도를 보여줍니다.


@aix가 말한 것 외에도 고려해야 할 사항은 속도 차이입니다.

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().


3
당신은 거기에서 사과와 사과를 비교하지 않습니다. from math import fabs확실히 사용 하고 -5.0둘 다 시도하십시오 .
— agf

또한 신뢰할 수없는 타이밍 결과? 처음에는 102ns에서 abs (-5)를 받았고 나중에 88.3ns로 표시했습니다. 내부적으로 문제를 피하려고 시도하더라도 벤치 마크의 단일 실행에서 결론을 도출하지 마십시오.
— Peter Hansen

1
두 가지 추가 사항 : abs는 내장 기능에서 조회되고 fab은 모듈 네임 스페이스에 있으므로 여전히 사과와 오렌지를 비교합니다. 그 효과를 제거하려면 "xabs = abs"다음에 xabs (num)을 수행하십시오. 또한 Python 3.2에서는 상황이 상당히 변경되고 분명히 abs ()는 적어도 float에서 상당히 빠릅니다 (> 2x).
— Peter Hansen

1
@PeterHansen 맞습니다, 그것들은 서로 다른 시스템 부하에서 두 번 실행되었습니다. 동일한 테스트 세트 내에서 비교할 때 상대적 차이는 여전히 유효합니다. 또한 네임 스페이스 차이를 지적 해 주셔서 감사합니다. 저는 고려하지 않았습니다. 3.2에서 시도해 보지 않았지만 알아두면 좋습니다! 나중에 귀하의 제안으로 답변을 업데이트하겠습니다 :) 다시 한 번 감사드립니다!
— KZ 2013 년

3

math.fabs()항상 float를 abs()반환하고 정수를 반환 할 수 있습니다.


6
abs__abs__호출 된 유형 의 특수 메서드에 따라 모든 유형을 반환 할 수 있습니다 .
— agf

0

abs(): 인수에 따라 절대 값을 반환합니다. 즉, 인수가 int이면 int를 반환하고, 인수가 float이면 float를 반환합니다. 또한 복잡한 변수 abs(a+bj)에서도 작동합니다. 즉, 절대 값을 반환합니다.math.sqrt(((a)**2)+((b)**2)

math.fabs(): 정수 또는 부동 값에서만 작동합니다. 인수 유형 (복소수 제외)에 관계없이 항상 절대 부동 소수점 값을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.