をあなたはパフォーマンスが必要な場合は、numpyのかnumbaを使用する必要があり、すべての低レベルルーチンがほぼC速度を行われています:
import numpy as np
bigarray=np.random.randint(0,2,10**4*3*2).reshape(10**4,3,2)
biglist=[[[e for e in B] for B in A] for A in bigarray]
# [[[1, 0], [0, 0], [1, 0]],
# [[0, 0], [0, 1], [0, 1]],
# [[1, 0], [1, 0], [0, 0]], ...
def your_count(biglist):
integers=[]
for k in biglist:
num = int("".join(str(row[0]) for row in k), 2)
integers.append(num)
return integers
def count_python(big):
m=len(big)
integers=np.empty(m,np.int32)
for i in range(m):
n=len(big[i])
b=1
s=0
for j in range(n-1,-1,-1):
s = s+big[i][j][0]*b
b=b*2
integers[i]=s
return integers
def count_numpy(bigarray):
integers=(bigarray[:,:,0]*[4,2,1]).sum(axis=1)
return integers
from numba import njit
count_numba =njit(count_python)
そして、いくつかのテスト:
In [125]: %timeit your_count(biglist)
145 ms ± 22.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [126]: %timeit count_python(biglist)
29.6 ms ± 1.13 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [127]: %timeit count_numpy(bigarray)
354 µs ± 10.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [128]: %timeit count_numba(bigarray)
73 µs ± 938 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
NumbaをコンパイルすることができますいくつかのPythonコードの低レベルバージョン(Numbaは文字列とリストを管理しないため、numpy配列のみ) Numpyは、良い演奏のために、ある命令で素晴らしいことをするための特別な構文を与えます。
Numbaソリューションは、ここでは2000倍高速です。
カウントが効率的にcollections.Counter
またはnp.unique
によって計算される:/:
In [150]: %timeit {k:v for k,v in zip(*np.unique(integers,return_counts=True))}
46.4 µs ± 1.55 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [151]: %timeit Counter(integers)
218 µs ± 11.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
私は(httpsをあなたのコードが正常に動作していますが、それを強化したい場合は、[コードレビュースタック交換]でこれを投稿する必要がありますね/codereview.stackexchange.com/) – RoyaumeIX
どのような整数値の範囲が可能ですか? – randomir
"行"はそれぞれ同じ量ですか?つまり、ここでは3ビットしか扱っていないのですか?それとももっと大きくなるのでしょうか? –