けっきょくCですか・・・
使う配列の型にもよるんですが、普通にintの配列とかにするのであれば、以前の質問で質問者様が質問文に載せたロジックで十分速いと思いますよ。
逆に、私がnumpyで書いた方法はループごとにスライスして動的メモリ確保して、と余計なオーバーヘッドがあるので、(書けたとして)恐らくCで同じことをやっても遅いです。python+numpyだと素直にやったのでは性能が出ないので、トリッキーな方法を取りましたが。あれはnumpyで行の比較を短絡評価する方法が探しても見つからなかったので、ああいうコードにした次第です。
あとはもしかしたら、memcmp
とか使えるかもしれません。
C言語 memcmp
自分でifを書くのとどっちが速いのかはやってみないとわかりませんが、まあ選択肢は色々あります。私のあのコードをなぞる必要はないです。
この質問とはあまり関係のないアドバイス
前回の質問は「numpy配列から探せ」という注文だったから、あえて書かなかったんですが、速さを求めるなら、たとえばこういうアプローチがあります。
python
1import timeit
2import numpy as np
3
4A = np.arange(5000000).reshape((1000000, 5)) # 注目
5
6def fa(a,b,c,d):
7 """
8 前回の回答の方式
9 """
10 tmp = A
11 for i, eqv in enumerate([a,b,c,d]):
12 tmp = tmp[tmp[:,i] == eqv]
13
14 tmp[:,-1]
15
16# 予めまるごとdictに変換しておけば極めて有利
17hashdic = {tuple(elem[:4]):elem[4] for elem in A}
18def fb(a,b,c,d):
19 hashdic.get((a,b,c,d))
20
21print(timeit.timeit(lambda : fa(0,1,2,3), number=1000))
22print(timeit.timeit(lambda : fb(0,1,2,3), number=1000))
23""" =>
246.048210394001217
250.0035514350020093843 # すごーい
26"""
まるごと変換する時間を関数の外に出しているので、同列に比較はできないんですが。Aがそんな頻繁に変わらないなら大丈夫でしょう。3桁速いです(データをでかくしたからなんだけど)。
小手先のテクニックで多少速くしたところで、線形探索したらO(n)です。でかいデータが相手だと、でかさに比例した時間がかかります。hashにすればO(1)です。ということを考える必要があります。
更に追記
python
1print(timeit.timeit(lambda :{tuple(elem[:4]):elem[4] for elem in A}, number=1))
2""" =>
32.8804931649938226
4"""
100万で3秒弱。ただし1000万に増やすとメモリ消費と処理時間がすごいことになります。まあ、微妙かも。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/14 12:36
2018/06/14 12:39
2018/06/14 12:58
2018/06/14 12:59
2018/06/14 13:11
2018/06/14 13:20
2018/06/14 13:25
2018/06/14 13:31
2018/06/14 13:42
2018/06/14 14:07
2018/06/14 14:23
2018/06/14 14:24