2009-12-02 4 views

답변

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, logldexp 사이 파이썬에서 감지 많은 차이가없는 빠른 비교입니다. 생각은 구현에 대해 아무 것도 알려주지 않습니다!

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

루틴이 로그보다 느리기 때문에 PyFloat_AsDouble이 꽤 무거워 보이는 것처럼 솔기가 맺힐 것입니다. –

+0

'Py_BuildValue'는 비교적 비쌉니다. – u0b34a0f6ae

+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.

에 있습니다. 그것은 파이썬에 있습니다.