У меня есть код, в котором я делаю много основных арифметических вычислений с кучей числовых данных, которые являются множественными массивами.Я понял, что в большинстве возможных операций классы numpy всегда медленнее, чем классы Python по умолчанию.Почему это так?
Например, у меня есть простой фрагмент, где все, что я делаю, это просто обновляю 1 элемент массива numpy другим, полученным из другого массива numpy, или я обновляю его математическим произведением 2 других массивов numpyэлементы.Это должна быть базовая операция, но она всегда будет как минимум в 2-3 раза медленнее, чем если бы я делал это с list
.
Сначала я подумал, что это потому, что я не гармонизировал структуры данных иКомпилятор должен сделать много ненужных преобразований.Затем я перекодировал все это и заменил все float
на numpy.float64
и каждый list
на numpy.ndarray
, и все данные по всему коду numpy.float64
, чтобы не было необходимости делать что-либо ненужноепреобразования.
Код все еще в 2-3 раза медленнее, чем если бы я просто использовал list
и float
.
Например:
ALPHA = [[random.uniform(*a_param) for k in range(l2)] for l in range(l1)]
COEFF = [[random.uniform(*c_param) for k in range(l2)] for l in range(l1)]
summa=0.0
for l in range(l1):
for k in range(l2):
summa+=COEFF[l][k] * ALPHA[l][k]
всегда будетБыть в 2-3 раза быстрее, чем:
ALPHA = numpy.random.uniform(*a_param, (l1,l2))
COEFF = numpy.random.uniform(*c_param, (l1,l2))
summa=0.0
for l in range(l1):
for k in range(l2):
summa+=COEFF[l][k] * ALPHA[l][k]
Как это возможно, я делаю что-то не так, поскольку numpy должен ускорить процесс.
Для записи, которую я использую Python 3.5.3
и numpy (1.12.1)
, мне обновить?