programing

Python의 지수화-math.pow 및 math.sqrt 대신 ** 연산자를 선호해야합니까?

nasanasas 2020. 12. 31. 08:29
반응형

Python의 지수화-math.pow 및 math.sqrt 대신 ** 연산자를 선호해야합니까?


이 질문에 이미 답변이 있습니다.

내 분야에서는 몇 가지 숫자를 제곱하고 함께 연산하고 결과의 제곱근을 취하는 것이 매우 일반적입니다. 이것은 예를 들어 피타고라스 정리와 RMS 계산에서 수행됩니다.

numpy에서 다음을 수행했습니다.

result = numpy.sqrt(numpy.sum(numpy.pow(some_vector, 2)))

그리고 순수한 파이썬에서는 다음과 같은 것이 예상됩니다.

result = math.sqrt(math.pow(A, 2) + math.pow(B,2)) # example with two dimensions.

그러나 나는 훨씬 더 간결하고 가져 오기에 독립적이며 겉보기에 동등 해 보이는이 순수한 파이썬 양식을 사용하고 있습니다.

result = (A**2 + B**2)**0.5   # two dimensions
result = (A**2 + B**2 + C**2 + D**2)**0.5

나는 어떤 사람들이 **연산자가 일종의 해킹 이라고 주장하는 것을 들었습니다 . 그리고 그것을 지수화하여 숫자를 제곱하는 0.5것은 그렇게 읽기 어렵습니다. 하지만 제가 묻고 싶은 것은 다음과 같습니다.

"전의 두 가지 대안을 세 번째 대안보다 선호하는 계산상의 이유가 있습니까?"

읽어 주셔서 감사합니다!


math.sqrt제곱근의 C 구현이므로 **Python의 내장 pow함수 를 구현 하는 연산자를 사용하는 것과 다릅니다 . 따라서 사용은 math.sqrt실제로 **연산자를 사용하는 것과 다른 대답을 제공하며 실제로 내장 된 것보다 모듈 구현 을 선호 numpy하거나 math모듈화 해야하는 계산상의 이유가 있습니다. 특히 sqrt 함수는 가능한 가장 효율적인 방법으로 구현되는 반면 **많은 수의 밑과 지수에 대해 작동하며 제곱근의 특정 경우에 대해 최적화되지 않았을 수 있습니다. 반면에 내장 pow함수는 "복소수, 무한 정수 거듭 제곱 및 모듈 식 지수"와 같은 몇 가지 추가 사례를 처리합니다.

**의 차이점에 대한 자세한 내용은이 스택 오버플로 질문을 참조하세요 math.sqrt.

더 "파이 토닉"이라는 측면에서 우리는 그 단어의 정의에 대해 논의 할 필요가 있다고 생각합니다. 에서 공식 파이썬 용어 , 그것은 코드 또는 아이디어의 조각이 경우 파이썬 것을 말한다 "밀접 아니라 다른 언어 개념을 공통를 사용하여 코드를 구현하는 것보다, 파이썬 언어의 가장 일반적인 숙어를 다음과 같습니다." 제가 생각할 수있는 다른 모든 언어에는 기본적인 제곱근 함수가있는 수학 모듈이 있습니다. 그러나 **C ++ 와 같은 전력 연산자가없는 언어가 있습니다 . 따라서 **아마도 더 Pythonic이지만 객관적으로 더 나은지 여부는 사용 사례에 따라 다릅니다.


기본 Python에서도 일반적인 형식으로 계산을 수행 할 수 있습니다.

result = sum(x**2 for x in some_vector) ** 0.5

x ** 2확실히 해킹이 아니며 수행 된 계산은 동일합니다 (cpython 소스 코드로 확인했습니다). 실제로 더 읽기 쉽고 가독성이 중요합니다.

대신 x ** 0.5제곱근을 사용하는 math.sqrt것은 전자 (아마도)가 로그를 사용하여 계산되고 후자가 (아마도) 수학 프로세서의 특정 숫자 명령을 사용하여 계산되는 것과 똑같은 계산을 수행하지 않습니다 .

나는 x ** 0.5그것을 위해 추가하고 싶지 않기 때문에 종종 사용 math합니다. 그러나 제곱근에 대한 특정 명령이 로그를 사용한 다단계 연산보다 (더 정확하게) 더 잘 작동 할 것으로 기대합니다.

참조 URL : https://stackoverflow.com/questions/18965524/exponentiation-in-python-should-i-prefer-operator-instead-of-math-pow-and-m

반응형