Старый вопрос, но я хотел бы, чтобы обеспечить свое собственное решение , которое оказаться самым быстрым, использовать нормальные list
вместо в np.array
качестве входных данных (или передачи список во - первых), на основании моих стендовых испытаний.
Проверьте это, если вы сталкиваетесь с этим также.
def count(a):
results = {}
for x in a:
if x not in results:
results[x] = 1
else:
results[x] += 1
return results
Например,
>>>timeit count([1,1,1,2,2,2,5,25,1,1]) would return:
100000 циклов, лучшее из 3: 2,26 мкс на цикл
>>>timeit count(np.array([1,1,1,2,2,2,5,25,1,1]))
100000 циклов, лучшее из 3: 8,8 мкс на цикл
>>>timeit count(np.array([1,1,1,2,2,2,5,25,1,1]).tolist())
100000 циклов, лучшее из 3: 5,85 мкс на цикл
Пока принятый ответ будет медленнее, а scipy.stats.itemfreq
решение еще хуже.
Более глубокое тестирование не подтвердило сформулированное ожидание.
from zmq import Stopwatch
aZmqSTOPWATCH = Stopwatch()
aDataSETasARRAY = ( 100 * abs( np.random.randn( 150000 ) ) ).astype( np.int )
aDataSETasLIST = aDataSETasARRAY.tolist()
import numba
@numba.jit
def numba_bincount( anObject ):
np.bincount( anObject )
return
aZmqSTOPWATCH.start();np.bincount( aDataSETasARRAY );aZmqSTOPWATCH.stop()
14328L
aZmqSTOPWATCH.start();numba_bincount( aDataSETasARRAY );aZmqSTOPWATCH.stop()
592L
aZmqSTOPWATCH.start();count( aDataSETasLIST );aZmqSTOPWATCH.stop()
148609L
Ссылка ниже приводятся комментарии к кешу и другим побочным эффектам в оперативной памяти, которые влияют на небольшой набор данных с повторяющимися результатами тестирования.
collections.Counter(x)
Достаточно ли ?