python frexp와 ldexp 함수는 float를 가수와 지수로 나눕니다. 이 프로세스가 실제 float 구조를 노출하는지 또는 파이썬이 값 비싼 로그 호출을 수행해야하는지 알 수 있습니까?ldexp와 frexp는 어떻게 파이썬에서 작동합니까?
2
A
답변
1
, 여기
$ python -m timeit -c 'from math import frexp' 'frexp(1.1)'
100000 loops, best of 3: 3.7 usec per loop
$ python -m timeit -c 'from math import log' 'log(1.1)'
100000 loops, best of 3: 3.7 usec per loop
$ python -m timeit -c 'from math import ldexp' 'ldexp(1.1,2)'
100000 loops, best of 3: 3.5 usec per loop
그래서 속도면에서 frexp
, log
및 ldexp
사이 파이썬에서 감지 많은 차이가없는 빠른 비교입니다. 생각은 구현에 대해 아무 것도 알려주지 않습니다!
5
파이썬 2.6의 math.frexp는 기본 C 라이브러리 frexp를 직접 호출합니다. 사용 가능한 경우 (IEEE 754)를 계산하는 대신 C 라이브러리가 단순히 float 표현의 부분을 사용한다고 가정해야합니다. 속도에 관해서는
static PyObject *
math_frexp(PyObject *self, PyObject *arg)
{
int i;
double x = PyFloat_AsDouble(arg);
if (x == -1.0 && PyErr_Occurred())
return NULL;
/* deal with special cases directly, to sidestep platform
differences */
if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {
i = 0;
}
else {
PyFPE_START_PROTECT("in math_frexp", return 0);
x = frexp(x, &i);
PyFPE_END_PROTECT(x);
}
return Py_BuildValue("(di)", x, i);
}
PyDoc_STRVAR(math_frexp_doc,
"frexp(x)\n"
"\n"
"Return the mantissa and exponent of x, as pair (m, e).\n"
"m is a float and e is an int, such that x = m * 2.**e.\n"
"If x is 0, m and e are both 0. Else 0.5 <= abs(m) < 1.0.");
1
이 쉽게 자신을 대답 할 수있는 질문은 다음과 같습니다
$ python
>>> import math
>>> help(math.frexp)
Help on built-in function frexp in module math:
을 주목 내장. 그것은
>>> import urllib
>>> help(urllib.urlopen)
Help on function urlopen in module urllib:
내장 여기 없음 C.
에 있습니다. 그것은 파이썬에 있습니다.
루틴이 로그보다 느리기 때문에 PyFloat_AsDouble이 꽤 무거워 보이는 것처럼 솔기가 맺힐 것입니다. –
'Py_BuildValue'는 비교적 비쌉니다. – u0b34a0f6ae
예, 파이썬은 당신이 퍼포먼스 해킹을 원할 때 찾을 언어가 아닙니다. –