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.