Самый быстрый способ численной обработки 2d-массива: кадр данных против серии против массива против нумбы

Изменить, чтобы добавить: Я не думаю, что показатели Numba справедливы, примечания ниже

Я пытаюсь сравнить различные подходы к числовой обработке данных для следующего варианта использования:

Довольно большой набор данных (более 100 000 записей)100+ строк довольно простого кода (z = x + y)Не нужно сортировать или индексировать

Другими словами, полная общность рядов и фреймов данных не требуется, хотя они включены сюда, потому что они все еще являются удобными способами инкапсуляции данных, и часто существует предварительная или постобработка, которая требует общности панд над NumPy массивов.

Вопрос: Исходя из этого варианта использования, подходят ли следующие тесты, и если нет, как я могу их улучшить?

# importing pandas, numpy, Series, DataFrame in standard way
from numba import jit
nobs = 10000
nlines = 100

def proc_df():
   df = DataFrame({ 'x': np.random.randn(nobs),
                    'y': np.random.randn(nobs) })
   for i in range(nlines):
      df['z'] = df.x + df.y
   return df.z

def proc_ser():
   x = Series(np.random.randn(nobs))
   y = Series(np.random.randn(nobs))
   for i in range(nlines):
      z = x + y
   return z

def proc_arr():
   x = np.random.randn(nobs)
   y = np.random.randn(nobs)
   for i in range(nlines):
      z = x + y
   return z

@jit
def proc_numba():
   xx = np.random.randn(nobs)
   yy = np.random.randn(nobs)
   zz = np.zeros(nobs)
   for j in range(nobs):
      x, y = xx[j], yy[j]
      for i in range(nlines):
         z = x + y
      zz[j] = z
   return zz

Результаты (Win 7, 3-летняя рабочая станция Xeon (четырехъядерный). Стандартный и недавний дистрибутив Anaconda или очень близкий.)

In [1251]: %timeit proc_df()
10 loops, best of 3: 46.6 ms per loop

In [1252]: %timeit proc_ser()
100 loops, best of 3: 15.8 ms per loop

In [1253]: %timeit proc_arr()
100 loops, best of 3: 2.02 ms per loop

In [1254]: %timeit proc_numba()
1000 loops, best of 3: 1.04 ms per loop   # may not be valid result (see note below)

Изменить, чтобы добавить (ответ на jeff) альтернативные результаты передачи df / series / array в функции, а не создания их внутри функций (т.е. переместите строки кода, содержащие 'randn' из внутренней функции во внешнюю функцию):

10 loops, best of 3: 45.1 ms per loop
100 loops, best of 3: 15.1 ms per loop
1000 loops, best of 3: 1.07 ms per loop
100000 loops, best of 3: 17.9 µs per loop   # may not be valid result (see note below)

Обратите внимание на результаты NumbaЯ думаю, что компилятор numba должен оптимизировать цикл for и сократить цикл for до одной итерации. Я не знаю этого, но это единственное объяснение, которое я могу придумать, поскольку оно не может быть в 50 раз быстрее, чем просто, да? Дополнительный вопрос здесь:Почему нумба здесь быстрее, чем нумпи?

Ответы на вопрос(2)

Ваш ответ на вопрос