2009-12-02 1 views
2

Функции python frexp и ldexp разделяют поплавки на мантиссы и экспоненты. Знаете ли кто-нибудь, если этот процесс предоставляет фактическую структуру float или требуется, чтобы python выполнял дорогостоящие логарифмические вызовы?Как работают ldexp и frexp в python?

ответ

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."); 
+0

Поскольку процедура медленнее, чем логарифм, она будет плавно, как PyFloat_AsDouble, довольно тяжелая. –

+0

'Py_BuildValue' может быть сравнительно дорогим. – u0b34a0f6ae

+0

Да, я полагаю, python - это просто не язык, на который нужно искать, когда вы хотите сделать хаки производительности :) –

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.