Вычисления на собственные значения в Python выполняются намного медленнее, чем в MATLAB на моем компьютере. Почему?

#python #matlab #numpy #eigenvalue

#python #matlab #numpy #собственное значение

Вопрос:

Я хотел бы вычислить собственные значения матриц большого размера (около 1000×1000), используя Python 2.6.5. Я не смог сделать это быстро. Я не нашел никаких других потоков, посвященных этому вопросу.

Когда я запускаю

 a = rand(1000,1000);
tic;
for i =1:10
    eig(a);
end
toc;
  

в MATLAB это занимает около 30 секунд. Аналогичный тест в Python требует 216 секунд. Запуск его через R с использованием RPy не ускорил вычисления заметно. Тест в Octave занял 93 секунды. Я немного сбит с толку разницей в скорости.

Единственный пример вопроса, подобного этому, который я могу найти в Интернете, — это this, которому несколько лет. У плаката в этом вопросе другая структура каталогов Python (которую я приписываю возрасту сообщения, хотя я могу ошибаться), поэтому я не был достаточно уверен, чтобы пытаться следовать инструкциям, опубликованным корреспондентом.

Мой менеджер пакетов говорит, что у меня установлен LAPACK, и я использую NumPy и SciPy для вычислений на Python:

 from numpy import *
from scipy import *
from numpy.linalg import *
import time

a = randn(1000,1000)
tic = time.clock()
for i in range(0,10):
    eig(a)
toc = time.clock()
print "Elapsed time is ", toc-tic
  

Я довольно новичок в Python, так что, возможно, я сделал что-то глупое. Пожалуйста, дайте мне знать, если мне нужно будет предоставить еще какую-либо информацию.

Комментарии:

1. Используете ли вы одинаковую точность в Python и Matlab?

2. Вам действительно нужно убедиться, что ваш отступ в вашем коде Python абсолютно правильный. Ваш пример не может выполняться так, как написано.

3. Просто чтобы вы знали, что вы должны использовать rand для обоих (равномерное распределение) или randn (нормальное распределение), но не смешивать их. Однако это не объясняет разницу.

4. С какими таймингами это было бы svd ? Кроме того, пожалуйста, переформатируйте свой код должным образом, не импортируйте то, что вы не используете, и, пожалуйста, старайтесь избегать идиом from . import * . Спасибо

5. Я пробовал svd (3 секунды без цикла ) и eigvals (12 секунд), для сравнения с 30 секундами с eig . Хотя с svd вы получаете только сингулярные значения a’*a, а не a .

Ответ №1:

Я думаю, что вы видите разницу между библиотекой ядра Intel Math (MKL), которая используется Matlab, и любой другой реализацией LAPACK, которая у вас есть в вашей системе (может быть, ATLAS?), с которой связан scipy. Вы можете видеть, насколько быстрее MKL в этих тестах.

Я полагаю, что вы получили бы намного лучшую производительность, если бы могли перестроить Scipy на библиотеки Intel MKL. Если вы используете Windows, готовые копии можно загрузить отсюда, или вы могли бы рассмотреть возможность использования чего-то вроде дистрибутива Enthought Python.

Комментарии:

1. Это, безусловно, большая его часть. Сравнение np.linalg.eig версии numpy с использованием ATLAS с версией, связанной с MKL, приводит к примерно трехкратной разнице на моей машине для массива размера OP. (10,1 сек против 3,2 сек)

Ответ №2:

Я действительно получаю разницу во времени, но не такую резкую, как у вас. Мое время MATLAB (R2010b) составляло ~ 25 секунд, а время python (2.7) — ~ 60 секунд.

Я не очень удивлен этими числами, поскольку MATLAB это исключительно язык числовых и матричных манипуляций, и у него есть преимущество в его JIT ускорителе перед python , который является языком общего назначения. Как правило, различия между MATLAB и python numpy довольно малы, но становятся очевидными, когда размер матрицы велик, как в вашем случае.

Это не означает, что нет способов улучшить производительность python. Статья о PerformancePython на веб-сайте scipy дает хорошее представление о различных способах, с помощью которых вы можете улучшить производительность python.