Aspiring Data Science
318 subscribers
386 photos
10 videos
6 files
1.39K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#numpy #numba #codegems #calloc

Итак, выяснилось, что numpy.zeros делегирует вызов сишной calloc, и на самом деле читит. Если тестировать инициализацию массива с реальной записью хотя бы 1 элемента, всё стаёт на свои места. .zeros() чуть медленнее остальных, .fill(0) несущественно быстрее двоеточий. Но удивительно, что нумба медленнее в 2-8 раз.

shape = (10000, 10000)
a = np.zeros(shape, dtype=np.int64)

def alloc_new(a):
a = np.zeros(shape, dtype=np.int64)
a[500, 500] = 1
return a

def numpy_fancy_assign(a):
a[:, :] = 0
a[500, 500] = 1
return a

def numpy_fill(a):
a.fill(0)
a[500, 500] = 1
return a

def cyclces_assign(a):
for i in range(a.shape[0]):
for j in range(a.shape[1]):
a[i, j] = 0
a[500, 500] = 1
return a

njitted_funcs = []
funcs = (alloc_new, numpy_fancy_assign, numpy_fill, cyclces_assign)
for func in funcs:
njitted_func = njit(func)
njitted_func(a) # test call
njitted_funcs.append(njitted_func)