Сравнение векторизации и оптимизации R и Python

#python #r #optimization #vectorization

Вопрос:

В языке R оптимизация может быть достигнута с помощью purrr::map() furrr::future_map() функций или. Однако я не уверен, как работает оптимизация для np.array() методов. Действительно, я хотел бы понять, как Python и R масштабируются до параллельной обработки [1, 2] с точки зрения сложности и производительности.

Таким образом, возникают следующие вопросы:

Как работает оптимизация np.array() в Python по сравнению с purrr::map() функциями и furrr::future_map() функциями на языке R?

Проведя простой tictoc тест на purrr / furrr , я могу заметить, что в обоих случаях мы выиграли от векторизации. Тем не менее, я также могу заметить, что результаты, похоже, показывают, что язык R просто принципиально быстрее.

Питон

 import time

a = np.random.rand(1000000)
b = np.random.rand(1000000)

tic = time.time()
c = np.dot(a,b)
toc = time.time()

print ("Vectorized version:"   str(1000*(toc-tic))  "ms")

c = 0
tic = time.time()
for i in range(1000000):
  c  = a[i]*b[i]
toc = time.time()

print("For loop:"   str(1000*(toc-tic))  "ms")
 

Выход

Векторизованная версия: 54.151296615600586 мс

Для цикла: 676.0082244873047 мс

R

 a <- runif(1000000,0,1)
b <- runif(1000000,0,1)

c = 0
tictoc::tic()
c = sum(a * b)
tictoc::toc()

c = 0
tictoc::tic()
  for (i in 1:length(a)) {
    c = a[i]*b[i]   c
  }
tictoc::toc()
 

Выход

Векторизованная версия: прошло 0,013 секунды

Для цикла: прошло 0,065 секунды

Рекомендации

[1] Росс Ихака и Роберт Джентльмен (1996) R: Язык для анализа данных и графики, Журнал вычислительной и графической статистики, 5:3, 299-314, DOI: 10.1080/10618600.1996.10474713

[2] С. ван дер Уолт, С. С. Кольбер и Г. Вароко, «Массив NumPy: структура для эффективных численных вычислений», в «Вычислениях в науке и технике», том 13, № 2, стр. 22-30, март-апрель 2011, doi: 10.1109/MCSE.2011.37

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

1. В чем сходство?

2. Кроме того, похоже, что вы продаетесь в использовании R, так зачем вообще использовать Python?

3. Ваши последние изменения делают этот вопрос еще более широким, хотя на самом деле вы должны сделать его гораздо более конкретным вопросом, который является темой для ТАК

4. Вам нужно задать только один из этих вопросов на каждый пост, и я не знаю, что эти отдельные вопросы все равно подойдут для ЭТОГО. Это уже третий раз, когда он появляется в очереди на повторное открытие, и он все еще слишком широк

5. Если вы не хотите проводить измерения, используйте timeit. Реальное время работы %timeit np.dot(a,b) на не очень медленном процессоре должно составлять 0.x мс (в зависимости от серверной части BLAS (например. Intel MKL). Вы также можете включить, например, jit-скомпилированную функцию с использованием Numba. (также выполняется в 0.x мс), исключая время компиляции (скомпилированная функция также может быть кэширована). Аналогичная вещь также должна быть сделана для кода R, который выглядит медленным для скомпилированного языка (возможно, включено некоторое время компиляции?)

Ответ №1:

Я считаю, что numpy упаковывает некоторые из своих «примитивных» объектов в классы-оболочки, которые сами являются Python (например, этот). Глядя на зеркальный источник R, я, наоборот, нахожу класс массива, который в основном является машинным кодом (он же C). Я думаю, что только этот дополнительный косвенный слой мог бы объяснить разницу в скорости.

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

1. Да, но на каком уровне сложности и производительности?

2. Похоже на 4-кратное ускорение, основанное на этом показателе выше (n=1). Запуск многих независимых тестов даст больше данных, но 4x кажется справедливым.