MATLAB быстрее, чем Python?

34

Я хочу вычислить магнитные поля некоторых проводников, используя закон Био-Савара, и я хочу использовать матрицу 1000x1000x1000. Прежде чем использовать MATLAB, но теперь я хочу использовать Python. Является ли Python медленнее, чем MATLAB? Как я могу сделать Python быстрее?

EDIT: Возможно, лучший способ - вычислить большой массив с C/С++, а затем перенести их на Python. Затем я хочу визуализировать VPython.

EDIT2: что лучше в моем случае: C или С++?

  • 4
    Трудно оценить скорость без кода. Если у вас есть работающий код на Python, вы можете опубликовать его снова, чтобы получить советы по ускорению.
  • 1
    Matlab обычно смехотворно хорош в оптимизации матричных вычислений
Показать ещё 4 комментария
Теги:
performance
matrix

8 ответов

26
Лучший ответ

Вы можете найти полезные результаты в нижней части этой ссылки

http://wiki.scipy.org/PerformancePython

Из введения

Сравнение переплетения с NumPy, Pyrex, Psyco, Fortran (77 и 90) и С++ для решения уравнения Лапласа.

Он также сравнивает MATLAB и, похоже, показывает схожие скорости при использовании Python и NumPy.

Конечно, это только конкретный пример, ваше приложение может обеспечить лучшую или худшую производительность. Нет никакого вреда в выполнении одного и того же теста для обоих и сравнения.

Вы также можете скомпилировать NumPy с оптимизированными библиотеками, такими как ATLAS, который предоставляет некоторые BLAS/LAPACK. Они должны иметь сопоставимую скорость с MATLAB.

Я не уверен, что файлы NumPy уже созданы против него, но я думаю, что ATLAS настроит библиотеки на вашу систему, если вы скомпилируете NumPy,

http://www.scipy.org/Installing_SciPy/Windows

Ссылка содержит более подробную информацию о том, что требуется на платформе Windows.

EDIT:

Если вы хотите узнать, что лучше работает, C или С++, возможно, стоит задать новый вопрос. Хотя из ссылки выше С++ имеет лучшую производительность. Другие решения довольно близки, например, Pyrex, Python/Fortran (с использованием f2py) и встроенного С++.

Единственная матричная алгебра в С++, которую я когда-либо делал, заключалась в использовании MTL и реализации расширенного фильтра Kalman. Я предполагаю, что, по сути, это зависит от библиотек, которые вы используете LAPACK/BLAS, и насколько они оптимизированы.

Эта ссылка содержит список объектно-ориентированных числовых пакетов для многих языков.

http://www.oonumerics.org/oon/

18

NumPy и MATLAB используют базовый BLAS для стандартных операций линейной алгебры. Некоторое время оба использовали ATLAS, но в настоящее время MATLAB, по-видимому, также поставляется с другими реализациями, такими как Intel Библиотека математического ядра (MKL). Какой из них быстрее зависит от того, насколько сильно зависит система и как была скомпилирована реализация BLAS. Вы также можете скомпилировать NumPy с MKL и Enthought работает над поддержкой MKL для своего дистрибутива Python (см. Их roadmap). Вот также недавний интересный пост в блоге об этом.

С другой стороны, если вам нужны более специализированные операции или структуры данных, то оба Python и MATLAB предлагают вам различные способы оптимизации (например, Cython, PyCUDA,...).

Изменить: я исправил этот ответ, чтобы принять во внимание различные реализации BLAS. Надеюсь, теперь это справедливое представление о нынешней ситуации.

  • 0
    Вы должны уточнить, что вы подразумеваете под «одними и теми же базовыми числовыми библиотеками». Matlab является закрытым исходным кодом и работает дольше, чем Python, гораздо меньше NumPy, поэтому мне трудно думать о том, что может быть общего, скажем, помимо набора инструкций SSE.
  • 2
    Upvoted. Никто (я преувеличиваю) не пишет подпрограмм манипуляции с матрицами, каждый их вызывает. Конечно, кто-то должен написать их в первую очередь, но если бы вы писали Matlab или SciPy, вы бы нашли потрясающе быструю реализацию BLAS для вашей целевой платформы (платформ) и назвали бы ее. Я буду очень удивлен, узнав, что один значительно быстрее другого.
Показать ещё 1 комментарий
7

Единственным допустимым тестом является его оценка. Это действительно зависит от вашей платформы и того, насколько хорошо закон Biot-Savart соответствует встроенным операциям Matlab или NumPy/SciPy.

Что касается ускорения работы Python, Google работает над Unladen Swallow, JIT-компилятором для Python. Возможно, есть и другие подобные проекты.

  • 0
    Но не могли бы вы сделать приблизительную оценку?
  • 1
    На самом деле, нет. В глубине души, если все сделано правильно, они оба будут работать векторизованный C-код. Я не знаю, насколько хорошо оптимизирован Matlab (нет доступа к коду) или NumPy / SciPy (не смотрел) с точки зрения использования инструкций SSE (или эквивалентных). Я также не знаю, насколько быстрее Unladen Swallow сделает код Python. Matlab также предпочитает хранить данные с double точностью; Вы не говорите нам, использует ли ваш код Python float или double или что-то еще. Короче говоря, это классический случай недостатка данных. Таким образом, «единственный действительный тест - это бой».
Показать ещё 1 комментарий
4

В соответствии с вашим изменением 2 я настоятельно рекомендую использовать Fortran, потому что вы можете использовать доступные подпрограммы линейной алгебры (Lapack и Blas), и это упрощает процесс, чем C/С++ для вычисления матриц.

Если вы предпочитаете использовать подход C/С++, я бы использовал C, потому что вам, по-видимому, нужна сырая производительность на предположительно простом интерфейсе (вычисления в матрице имеют простые интерфейсы и сложные алгоритмы).

Если, однако, вы решите пойти с С++, вы можете использовать TNT (Template Numerical Toolkit, С++-реализацию Lapack).

Удачи.

  • 0
    Спасибо за хороший ответ!
3

Если вы используете Python (с NumPy), он может быть медленнее, в зависимости от того, какие элементы вы используете, независимо от того, установлены ли у вас библиотеки с оптимальной линейной алгеброй, и насколько хорошо вы знаете, как использовать NumPy.

Чтобы сделать это быстрее, есть несколько вещей, которые вы можете сделать. Существует инструмент под названием Cython, который позволяет добавлять объявления типа в код Python и переводить его в модуль расширения Python в C. How Много пользы от этого зависит от того, насколько вы прилежны с вашими объявлениями типа - если вы вообще не добавили, вы не увидите никакой пользы. Cython также поддерживает типы NumPy, хотя они немного сложнее других типов.

Если у вас есть хорошая графическая карта и вы хотите немного узнать о вычислениях на GPU, PyCUDA также может помочь. (Если у вас нет графической карты nvidia, я слышал, что PyOpenCL тоже работает). Я не знаю ваш проблемный домен, но если он может быть отображен в проблему CUDA, он должен иметь возможность эффективно обрабатывать ваши элементы 10 ^ 9.

2

И вот обновленное "сравнение" между MATLAB и NumPy/MKL на основе некоторых функций линейной алгебры:

http://dpinte.wordpress.com/2010/03/16/numpymkl-vs-matlab-performance/

Точечный продукт не настолько медленный; -)

  • 0
    Версия MATLAB довольно старая. Интересно, какая разница.
0

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

Короче говоря, функция FFT в MATLAB лучше, чем Python, но вы можете сделать некоторые простые манипуляции, чтобы получить сопоставимые результаты и скорость. Я также обнаружил, что импорт данных был быстрее в Python по сравнению с MATLAB (даже для файлов MAT с помощью scipy.io).

0

Я также хотел бы отметить, что Python (+ NumPy) может легко взаимодействовать с Fortran через модуль F2Py, который в основном связывает ваши родные скорости Fortran с фрагментами кода, которые вы загружаете в него.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню