하나의 프로그램에서 많은 로그 계산을 사용해야합니다. 대수 기본의 측면에서, 절차는 구체적이지 않습니다. 파이썬 3.5 math
모듈에서 다른 어떤 것보다베이스 n
(2? 10? e?)이 더 빠르다면 어쩌면 코드가 a
인 코드가 log_a(x) = log_n(x)/log_n(a)
으로 변환 되었기 때문에 궁금합니다. 또는 모든베이스가 C 라이브러리를 사용하여 동일한 방식으로 구현되기 때문에베이스의 선택이 계산 속도에 영향을 미치지 않습니까?파이썬에서 로그 계산의 기본이 속도에 영향을 줍니까?
답변
, 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;
}
이,,, 수와베이스의 자연 로그를 계산합니다.
이 소스는 또한 다른 대답의 log2
과 log10
이 log
보다 빠르다고 설명합니다. 표준 라이브러리 log2
및 log10
기능을 각각 사용하여 구현되므로 속도가 빨라집니다. 그러나 이러한 기능은 플랫폼에 따라 다르게 정의됩니다.
참고 : C에 익숙하지 않아 여기에 잘못되었을 수 있습니다.
나는 C 코드를 해석 할 입장이 아니다. 그러나 나는 이것이 같은 C 라이브러리 전략을 사용하기 때문에'log (x), log2 (x), log10 (x)'는 같은 속도를 가져야한다는 것을 이해한다. 그리고'log (x, n)'은 제 질문의 대수 공식을 사용하기 때문에 느립니다. – MrT
네, 맞습니다. –
흥미로운 질문입니다. 나는 "좋은 예전"필드 테스트 (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
의 경우 사진이 다릅니다. 종류의 당신이 중요하지 않습니다
>>> 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
[파이썬의 수학 함수는 어디서 검사 할 수 있습니까?] (https://stackoverflow.com/questions/5476189/where-can-i-inspect-pythons-math-functions) –
numpy를 사용하고 있습니까? 또는 다른 도서관? 벡터/벡터화 된 메서드를 사용하는 함수가 있습니까? – Jon
직접 벤치마킹을 시도 할 수도 있지만 코드에 따라 차이가있을지라도 다른 유형의 오버 헤드가 크게 위태로워 질 수 있습니다. – jdehesa