2017-12-18 12 views
5

하나의 프로그램에서 많은 로그 계산을 사용해야합니다. 대수 기본의 측면에서, 절차는 구체적이지 않습니다. 파이썬 3.5 math 모듈에서 다른 어떤 것보다베이스 n (2? 10? e?)이 더 빠르다면 어쩌면 코드가 a 인 코드가 log_a(x) = log_n(x)/log_n(a)으로 변환 되었기 때문에 궁금합니다. 또는 모든베이스가 C 라이브러리를 사용하여 동일한 방식으로 구현되기 때문에베이스의 선택이 계산 속도에 영향을 미치지 않습니까?파이썬에서 로그 계산의 기본이 속도에 영향을 줍니까?

+1

[파이썬의 수학 함수는 어디서 검사 할 수 있습니까?] (https://stackoverflow.com/questions/5476189/where-can-i-inspect-pythons-math-functions) –

+0

numpy를 사용하고 있습니까? 또는 다른 도서관? 벡터/벡터화 된 메서드를 사용하는 함수가 있습니까? – Jon

+0

직접 벤치마킹을 시도 할 수도 있지만 코드에 따라 차이가있을지라도 다른 유형의 오버 헤드가 크게 위태로워 질 수 있습니다. – jdehesa

답변

4

, math.log베이스 독립하지만, 플랫폼에 의존합니다. C source for the math module에서 1940-1961 행에는 math.log의 코드가 표시됩니다. 는 C log 기능 e에 대한 특별 점검을하지 않는 한,이 같은 속도로 실행할 수 있도록 상관없이

math_log_impl(PyObject *module, PyObject *x, int group_right_1, 
      PyObject *base) 
/*[clinic end generated code: output=7b5a39e526b73fc9 input=0f62d5726cbfebbd]*/ 

{ 
    PyObject *num, *den; 
    PyObject *ans; 

    num = loghelper(x, m_log, "log"); // uses stdlib log 
    if (num == NULL || base == NULL) 
     return num; 

    den = loghelper(base, m_log, "log"); // uses stdlib log 
    if (den == NULL) { 
     Py_DECREF(num); 
     return NULL; 
    } 

    ans = PyNumber_TrueDivide(num, den); 
    Py_DECREF(num); 
    Py_DECREF(den); 
    return ans; 
} 

이,,, 수와베이스의 자연 로그를 계산합니다.

이 소스는 또한 다른 대답의 log2log10log보다 빠르다고 설명합니다. 표준 라이브러리 log2log10 기능을 각각 사용하여 구현되므로 속도가 빨라집니다. 그러나 이러한 기능은 플랫폼에 따라 다르게 정의됩니다.

참고 : C에 익숙하지 않아 여기에 잘못되었을 수 있습니다.

+1

나는 C 코드를 해석 할 입장이 아니다. 그러나 나는 이것이 같은 C 라이브러리 전략을 사용하기 때문에'log (x), log2 (x), log10 (x)'는 같은 속도를 가져야한다는 것을 이해한다. 그리고'log (x, n)'은 제 질문의 대수 공식을 사용하기 때문에 느립니다. – MrT

+0

네, 맞습니다. –

2

흥미로운 질문입니다. 나는 "좋은 예전"필드 테스트 (Linux에서의 CPython 3.6.2, x86_64, i7-3740QM CPU - 파이썬 인터프리터가이 CPU가 켜져있는 모든 최적화가 가능하도록 컴파일 됨)를 수행했습니다.

>>> math.log10(3) 
0.47712125471966244 
>>> math.log(3, 10) 
0.47712125471966244 
>>> timeit.timeit('math.log(3, 10)', setup = 'import math') 
0.2496643289923668 
>>> timeit.timeit('math.log10(3)', setup = 'import math') 
0.14756392200069968 

Log10은 log (n, 10)보다 분명 빠릅니다.

>>> math.log2(3.0) 
1.584962500721156 
>>> math.log(3.0, 2.0) 
1.5849625007211563 
>>> timeit.timeit('math.log2(3.0)', setup = 'import math') 
0.16744944200036116 
>>> timeit.timeit('math.log(3.0, 2.0)', setup = 'import math') 
0.22228705599263776 

Log2도 log (n, 2)보다 분명 빠릅니다. Btw, 어느 쪽이든, 수레와 정수는 똑같이 빠릅니다.

numpy의 경우 사진이 다릅니다. 종류의 당신이 중요하지 않습니다

으로 CPython에서
>>> timeit.timeit('numpy.log(numpy.arange(1, 10))', setup = 'import numpy') 
2.725074506000965 
>>> timeit.timeit('numpy.log10(numpy.arange(1, 10))', setup = 'import numpy') 
2.613872367001022 
>>> timeit.timeit('numpy.log2(numpy.arange(1, 10))', setup = 'import numpy') 
2.58251854799164