2013-09-23 2 views
48

내 분야에서는 숫자를 정사각형으로 묶어서 함께 사용하고 결과의 제곱근을 취하는 것이 일반적입니다. 이것은 pythagorean theorem과 RMS 계산에서 이루어집니다.파이썬의 지수화 - math.pow 및 math.sqrt 대신 ** 연산자를 선호해야합니까?

는 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만큼 읽기 쉽지 않다고 주장합니다. 그러나 내가 물어보고 싶은 것은 :

"이전 두 가지 대안을 세 번째 개념보다 선호하는 이유는 무엇입니까?"

읽어 주셔서 감사합니다.

+1

관련 스레드 일 수 있습니다. http://stackoverflow.com/questions/327002/which-is-faster-in-python-x-5-or-math-sqrtx –

+1

경향이 있습니다. math.sqrt()가() **보다 읽기 쉽다고 생각하는 것. –

+1

@Maxime, 나는 하나 더 나아가서'sqrt'와'from math import sqrt'를 사용한다. –

답변

43

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

See this Stack Overflow question for more information on the difference between ** and math.sqrt.

는 "파이썬"더, 나는 우리가 그 단어의 매우 정의를 논의 할 필요가 있다고 생각합니다. the official Python glossary에서 "다른 언어와 공통된 개념을 사용하여 코드를 구현하는 것이 아니라 Python 언어의 가장 일반적인 관용구를 밀접하게 따르는 경우 코드 또는 아이디어가 Python입니다."내가 생각할 수있는 다른 모든 언어에는 기본 제곱근 함수가있는 수학 모듈이 있습니다. 그러나 ** (예 : C++)과 같은 전윈 연산자가없는 언어가 있습니다. 따라서 **은 아마 Pythonic이지만 객관적으로 더 나은지 여부는 아닙니다. 사용 사례에 따라 달라집니다.

+0

'operator.pow'는 어디에 쓰입니까? –

+0

뛰어난 답변, 특히 OPTIONS에 중점을두고 OP 파이낸싱에 중점을 둔 파이썬 세입자를 위해. 명성. – GrayedFox

+0

그러나 입력이 정수인 경우 ** 또는 내장 된 pow 함수가 계산 상 더 좋습니다. "내장 된 ** 연산자와 달리 math.pow()는 두 인수를 모두 float 유형으로 변환합니다. ** 또는 정확한 정수 값을 계산하기위한 내장 된 pow() 함수. " - Python docs : 수학 라이브러리 https://docs.python.org/2/library/math.html#power-and-logarithmic-functions – hyperGeoMetric

12

에도 기본 파이썬에서 당신은

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

x ** 2은 입지 조건이 해킹하지 않고 수행되는 계산이 (내가 CPython의 소스 코드 확인) 동일한 일반적인 형태로 계산을 할 수 있습니다. 실제로 더 읽기 쉽도록 (그리고 가독성을 계산합니다). 제 (아마) 전 대수를 사용하여 계산하고 수학 프로세서의 특정 숫자 명령을 사용하여 (아마), 후자와 같은 math.sqrt으로 동일한 계산을하지 않습니다 제곱근을 대신 x ** 0.5를 사용

.

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

+2

분명히 [어느 쪽도 정확하지 않습니다] (http://stackoverflow.com/a/842358/199360) -하지만 [sqrt는 빠릅니다] (http://stackoverflow.com/a/327011/199360). – adib

+0

파이썬 인터프리터가 x ** 0.5를 특별한 경우로 인식하지 못하는 이유는 무엇입니까? 결국 0.5는 상수입니다. – user3150208