Первое правило numpy -
НИКАКИХ ЦИКЛОВ!from time import time
import numpy
from numpy.lib.stride_tricks import as_strided
def fill_matrix_python(width, height):
i, j = numpy.mgrid[0:height, 0:width]
return 22. / (i + j + 2)
def fill_matrix_native(width, height):
array = numpy.arange(2, width + height + 2)
stride = array.strides[0]
view_2d = as_strided(array,
shape=(width, height),
strides=(stride, stride))
return 22. / view_2d
start_time = time()
fill_matrix_python(10000, 10000)
print('Python implementation: Matrix 10000x10000 filled in %.3f seconds' % (time() - start_time))
start_time = time()
fill_matrix_native(10000, 10000)
print('Native implementation: Matrix 10000x10000 filled in %.3f seconds' % (time() - start_time))
Python implementation: Matrix 10000x10000 filled in 3.332 seconds
Native implementation: Matrix 10000x10000 filled in 0.532 seconds
Более красивое решение через mgrid под капотом реализовано все-таки через циклы на скрипте (благодарю
SkiBY за замечание).
Менее красивое решение через манипуляцию со страйдами реализовано полностью нативно.