Функции python frexp и ldexp разделяют поплавки на мантиссы и экспоненты. Знаете ли кто-нибудь, если этот процесс предоставляет фактическую структуру float или требуется, чтобы python выполнял дорогостоящие логарифмические вызовы?Как работают ldexp и frexp в python?
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
Math.frexp Python 2.6 просто вызывает базовую библиотеку C frexp напрямую. Мы должны предположить, что библиотека C просто использует части представления float непосредственно, а не вычисляет, если она доступна (IEEE 754).
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:
Нет встроенный здесь. Это в Python.
Поскольку процедура медленнее, чем логарифм, она будет плавно, как PyFloat_AsDouble, довольно тяжелая. –
'Py_BuildValue' может быть сравнительно дорогим. – u0b34a0f6ae
Да, я полагаю, python - это просто не язык, на который нужно искать, когда вы хотите сделать хаки производительности :) –