Подтвердить что ты не робот

Расчет собственных значений Python выполняется намного медленнее, чем вычисления MATLAB на моем компьютере. Зачем?

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

Когда я запустил

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

в MATLAB требуется около 30 секунд. Аналогичный тест на Python требует 216 секунд. Запуск его через R с использованием RPy не ускорил вычисление в значительной степени. Тест в Октаве занял 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, поэтому, возможно, я сделал что-то глупое. Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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