Вы должны быть в состоянии значительно улучшить скорость суммирования, используя numpy
для ее выполнения, вместо использования понимания списка и встроенной функции sum
(которая не использует преимущества numpy
векторизованных операций).
Просто замените:
hd.append([sum(c) for c in C])
на:
# Explicitly use uint16 to reduce memory cost; if array sizes might increase
# you can use uint32 to leave some wiggle room
hd.append(C.sum(1, dtype=np.uint16))
, который для двумерного массива возвратит новый одномерный массив, где каждое значение является суммойсоответствующая строка (благодаря указанию она должна работать на axis
1
).Например:
>>> arr = np.array([[True,False,True], [False,False,True], [True, True,True]], dtype=np.bool)
>>> arr.sum(1, np.uint16)
array([ 2, 1, 3], dtype=uint16)
Так как он выполняет всю работу на уровне C за одну операцию без преобразований типов (вместо вашего первоначального подхода, который требует цикл уровня Python, который работает с каждой строкой, то неявныйЦикл, который, в то время как на уровне C, все еще должен неявно преобразовывать каждое значение numpy
одно за другим из np.bool
в уровень Python int
s просто для их суммирования), это должно выполняться существенно быстрее для масштабов массива, которые выdescription.
Примечание: хотя это и не источник ваших проблем с производительностью, нет никаких причин, чтобы вручную поддерживать значение индекса;enumerate
может сделать это быстрее и проще.Просто замените:
i=1
for x in X:
... rest of loop ...
i+=1
на:
for i, x in enumerate(X, 1):
... rest of loop ...
, и вы получите то же поведение, но немного быстрее, в целом более кратким и чище.