Pertanyaan lama, tetapi saya ingin memberikan solusi saya sendiri yang ternyata menjadi yang tercepat, gunakan normal list
bukan np.array
sebagai input (atau transfer ke daftar terlebih dahulu), berdasarkan tes bangku saya.
Lihat itu jika Anda menemukannya juga.
def count(a):
results = {}
for x in a:
if x not in results:
results[x] = 1
else:
results[x] += 1
return results
Sebagai contoh,
>>>timeit count([1,1,1,2,2,2,5,25,1,1]) would return:
100000 loop, terbaik 3: 2,26 μs per loop
>>>timeit count(np.array([1,1,1,2,2,2,5,25,1,1]))
100000 loop, terbaik 3: 8,8 μs per loop
>>>timeit count(np.array([1,1,1,2,2,2,5,25,1,1]).tolist())
100000 loop, terbaik 3: 5,85 μs per loop
Sementara jawaban yang diterima akan lebih lambat, dan scipy.stats.itemfreq
solusinya bahkan lebih buruk.
Pengujian yang lebih mendalam tidak mengkonfirmasi ekspektasi yang dirumuskan.
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
Ref. komentar di bawah tentang cache dan efek samping dalam-RAM lainnya yang memengaruhi dataset kecil hasil pengujian berulang secara besar-besaran.
collections.Counter(x)
cukup?