728x90

파이썬의 pow

파이썬에는 두개의 pow함수가 있다.

하나는 math.pow 또 하나는 내장함수에 있는 pow이다.

그렇다면 이 둘의 차이는 무엇일까???

 

내장 pow

일단 그냥 pow를 살펴보자

def pow(base, exp, mod):

pow는 이런식으로 정의되어있다.

여기서 세번째 인자인 mod는 생략할 수 있다. 

 

간단한 예로 $15^3mod(11)$을 구한다고 하면

pow(15,3,11)

위와 작성해주면 된다.

 

그리고 vscode기준 f12를 눌러서 보면 알 수 있겠지만 base,exp의 자료형이 무엇인지에 따라 return값이 바뀌게 된다.

 

exp가 정수 일 때!!

1. base의 자료형이 int이면 return값은 int

2. base의 자료형이 complex(복소수)이면 return값은 complex

3. base의 자료형이 float이면 return값은 float이 된다.

이외에도 base의 자료형이 negativeInteger이고 exp가 float이면 return값이 complex가 될 수 있고 등등 여러가지가 있다.

하지만 exp가 complex, float 등일 때에는 더 다양한 경우가 나올 수 있다.

대충 이런식으로 내장함수의 pow가 정의되어있다.

 

math.pow

그렇다면 math 라이브러리에 있는 pow는 어떻게 되어있는 것일까?

pow(__x: _SupportsFloatOrIndex, __y: _SupportsFloatOrIndex) -> float

math.pow는 위와 같이 되어있다. 

내장함수에 들어있는 pow와는 다르게 return자료형이 float으로만 고정되어 있다.

그렇기에 어떤 자료형을 요구하는지에 사용법이 갈릴 수도 있겠다.

 

**사용

위와 같이 라이브러리를 사용할 수도 있겠지만 **을 그냥 쓸 수도 있다. 

 

성능

그렇다면 성능은 어떻게 될까?

 

작은 수에서는 신경쓰지 않는다면

from timeit import timeit
print(timeit('5 ** i%1000000007', setup='i = 300'))
print(timeit('pow(5, i,1000000007)', setup='i = 300'))
print(timeit('math.pow(5, i)%1000000007', setup='import math;i = 300'))

출력값

1.0633032
1.0442194000000002
0.43624410000000013

이런 결과가 나오게 된다. 큰 수 일때에는 math.pow가 훨씬 더 빠른 모습을 보여준다.

하지만 만약 i가 1000이 된다면 결과는 충격적(?)으로 바뀌게 된다..

3.3057072
1.1809585999999994
Traceback (most recent call last):
  File "c:\Projects\coding-test-study\baekjoon\python\1.py", line 4, in <module>
    print(timeit('math.pow(5, i)%1000000007', setup='import math;i = 1000'))
  File "C:\Users\JiHak\AppData\Local\Programs\Python\Python39\lib\timeit.py", line 233, in timeit
    return Timer(stmt, setup, timer, globals).timeit(number)
  File "C:\Users\JiHak\AppData\Local\Programs\Python\Python39\lib\timeit.py", line 177, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
OverflowError: math range error

위와 같이 pow를 사용할 때에는 **를 사용한 것보다 빠른 것을 볼 수가 있고 math.pow를 사용할 때에는 overflow에러가 발생하게 된다. 

오잉 python에서는 overflow가 없지 않나?? 생각하시는 분이 있을 수도 있겠지만 

python에서 float은 IEE754방법을 사용하고 있기 때문에 int형과는 다르게 float에서는 overflow가 발생할 수 있는 것이다.

728x90

+ Recent posts