Знаете ли вы, что этот код «в конечном итоге» выполняется парой библиотек, называемых LAPACK и BLAS?
Знаете ли вы, что Matlab поставляется с высоко оптимизированной библиотекой? Знаете ли вы, что во всех системах, на которых работает R, вы можете изменить , какой LAPACK / BLAS используется.
Разница имеет значение очень . Буквально сегодня утром друг опубликовал этот твит , противопоставляющий тот же код R , работающий на том же Windows компьютере , но в двух разных средах R. в шесть раз быстрее один «просто» использует параллельную реализацию LAPACK / BLAS.
Здесь вы даже не сказали нам, в какой операционной системе вы работаете. Вы можете получить OpenBLAS (который использует параллелизм) для всех ОС, на которых работает R. Вы даже можете довольно легко получить Intel MKL (который IIR C также использует Matlab) в некоторых ОС. Для Ubuntu / Debian я опубликовал скрипт на GitHub , который делает это за один шаг.
Наконец, много лет go я «унаследовал» быструю программу, работающую в Matlab на ( then-large-i sh) Windows компьютер. Я переписал часть Matlab (осторожно и медленно, это усилие) на C ++ с использованием RcppArmadillo, что привело к некоторым улучшениям - и поскольку мы могли запускать этот (теперь открытый исходный код) код параллельно из R на том же компьютере, еще несколько факторов. Вместе это было на несколько порядков превратить дневную симуляцию во что-то, что длилось несколько минут. Так что «да, вы можете».
Изменить: Поскольку у вас есть доступ к Ubuntu, вы можете переключиться с basi c LAPACK / BLAS на OpenBLAS с помощью одной команды, хотя я больше не знаком с Ubuntu 16.04 (поскольку я сам запускаю 20.04).
Edit 2: Взяв сравнение из твита Йозефа , Docker * 1033 Контейнер * r-base Я также поддерживаю (как часть Rocker Project ) OpenBLAS. [1] Итак, как только мы добавим его, например, через apt-get install libopenblas-dev
, время простого повторяющегося матричного перекрестного произведения переместится с
root@0eb44b1fcc06:/# Rscript -e 'v <- matrix(1:1e6,1e3); system.time(replicate(10, crossprod(v,v)))'
user system elapsed
9.289 0.084 9.373
root@0eb44b1fcc06:/#
на
root@67bd334f53d4:/# Rscript -e 'v <- matrix(1:1e6,1e3); system.time(replicate(10, crossprod(v,v)))'
user system elapsed
2.259 2.370 0.447
root@67bd334f53d4:/#
, что является существенным.