Почему ручное (-ISH) вычисление логарифмического эксплуатации быстрее, чем функции Numpy/Scipy?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Почему ручное (-ISH) вычисление логарифмического эксплуатации быстрее, чем функции Numpy/Scipy?

Сообщение Anonymous »

Я работаю с очень большим массивом и был удивлен, обнаружив, что вручную вычисление журнала суммы экспоненциальных, на самом деле быстрее, чем использование встроенных функций для этой задачи из Scipy (scipy.special.logsumexp) и даже Numpy (numpy.logaddexp.reduce)
Я предположил, что реализации библиотеки будут более оптимизированными. Я делаю что -то глупое или упускаю что -то очевидное? < /P>
# test_logsumexp.py

from functools import partial
import timeit
import numpy as np
from scipy.special import logsumexp

def logsumexp_manual(a, axis=-1):
max_vals = np.max(a, axis=axis)
exp_terms = np.exp(a - max_vals[..., np.newaxis])
sum_exp_terms = np.sum(exp_terms, axis=axis)
return max_vals + np.log(sum_exp_terms)

# Validity check
arr = np.random.rand(10_000, 30, 3)
scipy_result = logsumexp(arr, axis=-1)
numpy_result = np.logaddexp.reduce(arr, axis=-1)
manual_result = logsumexp_manual(arr)
np.testing.assert_allclose(scipy_result, manual_result)
np.testing.assert_allclose(scipy_result, numpy_result)

n_loops = 10
setup = ("import numpy as np; "
"from scipy.special import logsumexp, softmax; "
"arr = np.random.rand(10_000, 30, 3)")

total_scipy = timeit.timeit(
"logsumexp(arr, axis=-1)",
setup=setup,
number=n_loops,
)

total_numpy = timeit.timeit(
"np.logaddexp.reduce(arr, axis=-1)",
setup=setup,
number=n_loops,
)

logsumexp_partial = partial(logsumexp_manual, a=arr)
total_manual = timeit.timeit(
logsumexp_partial,
setup=setup,
number=n_loops,
)

print(f"Scipy logsumexp: {total_scipy / n_loops:.6f} seconds per loop")
print(f"Numpy logaddexp: {total_numpy / n_loops:.6f} seconds per loop")
print(f"Manual logsumexp: {total_manual / n_loops:.6f} seconds per loop")
smallest = min(total_scipy, total_numpy, total_manual)
< /code>
консольная вывод < /h1>
Scipy logsumexp: 0.070824 seconds per loop
Numpy logaddexp: 0.044226 seconds per loop
Manual logsumexp: 0.031754 seconds per loop


Подробнее здесь: https://stackoverflow.com/questions/797 ... y-function
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»