Почему производительность numpy.linalg.solve резко изменилась между версиями 1.26.4 и 2.0.0? ⇐ Python

Программы на Python
Anonymous
Почему производительность numpy.linalg.solve резко изменилась между версиями 1.26.4 и 2.0.0?

Сообщение Anonymous »

Я заметил, что производительность numpy.linalg.solve сильно отличается от версии 2.0.0 как в Linux, так и в Windows (не проверял на macOS). По сути, для разумных матриц (примерно до 1800x1800) новые версии работают намного быстрее (до 10 раз быстрее моей машины с Linux, я получил еще большее ускорение на Windows), затем для более крупных (примерно до 8800x8800) 1.26.4 версия быстрее, а для еще более крупных версия 2.0.0 снова становится быстрее.
Интересно, что случилось? Это связано с обновлением базовой библиотеки?
Если бы были какие-то изменения, влияющие на производительность, я бы ожидал, что что-то появится в примечаниях к выпуску, но там не было ничего особенного. сортировка.
Я провел небольшой тест с использованием perfplot:

Код: Выделить всё

import matplotlib.pyplot as plt
import numpy as np
import perfplot

def main():
plot = False

if not plot:
out = perfplot.bench(
setup=lambda n: np.random.rand(n + 1, n),
kernels=[lambda a: np.linalg.solve(a[1:], a[0])],
n_range=[2**k for k in range(15)],
)

np.savetxt("n.txt", out.n_range)
np.savetxt(f"timings_{np.__version__.replace(".", "_")}.txt", out.timings_s)
else:
n = np.loadtxt("n.txt")
timings_1_26_4 = np.loadtxt("timings_1_26_4.txt")
timings_2_0_0 = np.loadtxt("timings_2_0_0.txt")

plt.plot(n, timings_1_26_4, label="1.26.4")
plt.plot(n, timings_2_0_0, label="2.0.0")
plt.legend()
plt.show()

plt.plot(n, timings_1_26_4 / timings_2_0_0, label="1.26.4 / 2.0.0")
plt.plot([0, 2**14], [1.0, 1.0])
plt.legend()
plt.show()

if __name__ == "__main__":
main()
Я запустил его один раз с numpy==1.26.4 и один раз с numpy==2.0.0, а затем в третий раз с сюжетом=True< /code>, чтобы просто построить график.
Вот общий результат (ось X — количество неизвестных линейной системы, ось Y — время, необходимое для решения в секундах):Сравнение производительности numpy.linalg.solve между версиями 1.26.4 и 2.0.0.
Вот масштаб до n=200:Увеличьте масштаб начала графика.
А вот соотношение времени для 1.26.4 и времени для 2.0.0 (горизонтальная линия — y=1, чтобы увидеть, какое значение быстрее):
Соотношение таймингов для версий 1.26.4 и 2.0.0. Когда кривая находится выше горизонтальной линии, это означает, что v2.0.0 работает быстрее.
На последнем изображении видно, что имеется пик примерно при n=35 где у нас 10х.

Подробнее здесь: https://stackoverflow.com/questions/789 ... -between-v

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