В математике Taylor series важны для получения приближений функций с многочленами малой степени.Использование серии Тейлора для ускорения вычислений
Я хотел видеть, как такое приближение может быть полезно, например, для ускорения вычислений. Давайте использовать знаменитый ряд Тейлора:
log(1+x) = x + 0.5 * x^2 + (error term)
Морально вычисления значения многочлена степени 2 должен быть намного быстрее, чем вычисления log
.
Таким образом, код, чтобы проверить это:
import numpy, time
def f(t):
return t + 0.5 * t ** 2
f = numpy.vectorize(f)
s = time.time()
for i in range(100):
x = numpy.random.rand(100000)
numpy.log(1 + x)
print time.time() - s # 0.556999921799 seconds
s = time.time()
for i in range(100):
x = numpy.random.rand(100000)
f(x)
print time.time() - s # arghh! 4.81500005722 seconds
Почему полиномиальный метод в 10 раз медленнее, чем фактический журнал? Я ожидал обратного.
PS: Этот вопрос, вероятно, находится посреди SO и math.SE.
Имели вы посмотрите на то, как NumPy журнал вычисляет? Скорее всего, журнал numpy() довольно оптимизирован –
С помощью 'numpy.log (1 + x)' вы используете программирование массива NumPy, которое работает на самом деле векторизованным способом, тогда как с np.vectorize в качестве [doc] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html): «Функция векторизации предоставляется в первую очередь для удобства, а не для производительности». Таким образом, эквивалентным способом было бы прямо использовать 'x':' x + 0.5 * x ** 2' при замене 'f (x)'. – Divakar
Серия Taylor будет иметь проблемы сходимости для аргументов, которые находятся далеко от точки расширения. Это верно для всех экстраполяций. – duffymo