Я написал программу, которая обновляет список numpy
на каждой итерации и выполняет над ним некоторые операции. количество итераций зависит от времени. например, за 1 секунду может быть от 1000 до 2500 итераций. Это означает, что элементов в списке numpy не будет более 2500 для запуска программы в течение 1 секунды.
Я реализовал базовый алгоритм, и я не уверен, что это самый быстрый способ вычислить bonus
:
import numpy as np
cdef int[:, :] pl_list
cdef list pl_length
cdef list bonus
pl_list = np.array([[8, 7]], dtype=np.int32)
def modify(pl_list, pl_length):
cdef int k_const = 10
mean = np.mean(pl_list, axis=0)
mean = np.subtract(mean, pl_length)
dev = np.std(pl_list, axis=0)
mean[0] / dev[0] if dev[0] != 0 else 0
mean[1] / dev[1] if dev[1] != 0 else 0
bonus = -1 + (2 / (1 + np.exp(-k_const * mean)))
return list(bonus)
for i in range(2499): # I just simplified the loop. the main loop works like startTime - time.clock() < seconds
rand = np.random.randint(8, 64)
pl_length = [rand, rand-1]
pl_list = np.append(pl_list, [pl_length], axis=0)
bonus = modify(pl_list, pl_length)
Я думал ускорить эту программу, используя следующие идеи:
- используя
np.vstack
,np.stack
или, может быть,np.concatenate
вместоnp.append(pl_list, [pl_length])
(какой из них может быть быстрее?) Использование самодельных функций для вычисления np.std, np.mean следующим образом (поскольку в cython итерации в представлениях памяти выполняются так быстро):
cdef int i,sm = 0
for i in range(pl_list.shape[0]):
sm += pl_list[i]
mean = sm/pl_list.shape[0]
Я также думал об определении статической длины (например, 2500) для просмотров памяти, поэтому мне не нужно было бы использовать
np.append
, и я мог бы построить структуру очереди в этом списке numpy. (Как насчет библиотеки очередей? Это быстрее, чем пустые списки в таких операциях?)
Извините, если моих вопросов слишком много и они сложны. Я просто пытаюсь получить максимально возможную производительность по скорости.