Я хочу вычислить магнитные поля некоторых проводников с помощью закона Biot–Savart, и я хочу использовать 1000x1000x1000 матрица. Прежде чем я буду использовать MATLAB, но теперь я хочу использовать Python. Python медленнее, чем MATLAB? Как я могу сделать Python быстрее?
Править: Возможно, лучший способ состоит в том, чтобы вычислить большой массив с C/C++ и затем передачей их к Python. Я хочу визуализировать затем с VPython.
EDIT2: Который лучше в моем случае: C или C++?
Вы можете найти несколько полезных результатов внизу этой ссылки
http://wiki.scipy.org/performancepyphon
из введения,
Сравнение плетения с Numpy, Pyrex, Psyco, Фортран (77 и 90) и C ++ для решения уравнения Лапласа.
Это также сравнивает MATLAB и, похоже, показывает аналогичные скорости при использовании Python и Numpy .
Конечно, это только конкретный пример, ваше приложение может быть разрешено лучше или хуже. На одном и том же тесте нет вреда на одном и сравнении.
Вы также можете компилировать Numpy с оптимизированными библиотеками, такими как ATLAS , который обеспечивает некоторые BLAS / лапака . Они должны быть сопоставимыми скоростью к Matlab.
Я не уверен, что на нее уже построены Numpy загрузоки, но я думаю, что Atlas настроит библиотеки в вашу систему, если вы компилируете Numpy,
http://www.scipy.org/installing_scipy/windows
Ссылка имеет более подробную информацию о том, что требуется под платформой Windows.
Редактировать:
Если вы хотите узнать, что работает лучше, C или C ++, возможно, стоит задать новый вопрос. Хотя из ссылки выше C ++ имеет лучшую производительность. Другие решения также довольно близки, то есть Pyrex, Python / Fortran (используя F2PY) и встроенный C ++.
Единственная матричная алгебра под C ++, которую я когда-либо делал, использовал MTL и внедрение расширенного фильтра Kalman. Я думаю, хотя, по сути, это зависит от библиотек, которые вы используете лапак / BLAS и насколько хорошо это оптимизировано.
Эта ссылка имеет список объектных ориентированных численных пакетов для многих языков.
Единственный допустимый тест - это позоре. Это действительно зависит от того, на что такое ваша платформа, и насколько хорошо катаются закона Biot-Savart на встроенные операции MATLAB или Numpy / Scipy.
Что касается быстрее Python, Google работает над NUSHALDEN NULLALL, Compiler JIT для Python. Есть, вероятно, другие проекты, как это также.
Согласно Вашей редакции 2, я очень настоятельно рекомендую использовать Fortran, так как Вы можете использовать доступные подпрограммы линейной алгебры (Lapack и Blas), и это намного проще, чем C/C++ для матричных вычислений.
Если вы предпочитаете подход на Си/Си++, я бы использовал C, потому что вам, предположительно, нужна сырая производительность на предположительно простом интерфейсе (матричные вычисления, как правило, имеют простые интерфейсы и сложные алгоритмы).
Однако, если Вы решите использовать C++, Вы можете использовать TNT (Template Numerical Toolkit, C++ реализация Lapack).
Удачи.
Если вы просто используете Python (с NumPy), это может быть медленнее, в зависимости от того, какие части вы используете, установлены ли у вас оптимизированные библиотеки линейной алгебры, и насколько хорошо вы знаете, как воспользоваться NumPy.
Чтобы сделать его быстрее, есть несколько вещей, которые вы можете сделать. Есть инструмент под названием Cython, который позволяет добавлять объявления типов в код на Python и транслировать его в модуль расширения Python на C. Сколько пользы это даст вам, зависит немного от того, насколько тщательно вы работаете с объявлениями типов - если вы не добавите их вообще, вы не увидите в этом никакой пользы. В Cython также есть поддержка типов NumPy, хотя они немного сложнее, чем другие типы.
Если у вас хорошая видеокарта и вы хотите немного узнать о вычислениях на GPU, PyCUDA также может помочь. (Если у вас нет видеокарты nvidia, я слышал, что и в работах есть PyOpenCL). Я не знаю ваш проблемный домен, но если его можно сопоставить с проблемой CUDA, то он должен уметь хорошо работать с вашими 10^9 элементами.
NumPy и MATLAB используют базовую реализацию BLAS для стандартных операций линейной алгебры. Некоторое время оба использовали ATLAS , но в настоящее время MATLAB, по-видимому, также поставляется с другими реализациями, такими как Intel Math Kernel Library (MKL). Какой из них быстрее, насколько зависит от системы и от того, как была скомпилирована реализация BLAS. Вы также можете скомпилировать NumPy с MKL, и Enthought работает над поддержкой MKL для своего дистрибутива Python (см. Их план ). Вот также недавняя интересная запись в блоге об этом.
С другой стороны, если вам нужны более специализированные операции или структуры данных, Python и MATLAB предлагают вам различные способы оптимизации (например, Cython , PyCUDA , ...).
Изменить: я исправил этот ответ, чтобы учесть различные реализации BLAS. Я надеюсь, что теперь это справедливое представление о текущей ситуации.
Я также хотел бы отметить, что Python (+ NumPy) может легко взаимодействовать с Фортраном через модуль F2Py, который, по сути, дает вам собственные скорости Фортрана для фрагментов кода, которые вы загружаете в него.
А вот обновленное «сравнение» между MATLAB и NumPy / MKL на основе некоторых функций линейной алгебры:
http://dpinte.wordpress.com/2010/03/16/numpymkl-vs-matlab-performance/
Точечное произведение не так уж и медленно ; -)