파이썬의 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가 발생할 수 있는 것이다.
'알고리즘 > 이론,구현' 카테고리의 다른 글
파이썬에서 최대공약수(gcd), 최소공배수(lcm) 구현 방법 정리 (0) | 2022.10.14 |
---|---|
분할 정복을 통한 pow 구현하기 (0) | 2022.06.27 |