質問: 例を挙げて説明します。 たとえば、A,B,Cという3ユーザがいて、それぞれじゃんけんでグーチョキパーを出す確率が、 > > A: 20 30 50 > > B: 60 20 20 > > C: 20 40 40 > > > だとします。(数字は%で、トータルは100%固定) この場合、AとBよりAとCのほうが似た手を出すといえると思うので、 Cというユーザをレコメンドしたいです。 これを毎回計算すると、計算量が多く速度が出ないのではと懸念しています。 ユーザごとの類似度を事前に計算しておき、別テーブルに格納するなどは思いつくのですが、 他によい手法等ありましたら教えて頂きたいです。 ポイントとしては、 1. トータルの値は固定で、カラム数も決まっている(今回でいうと、グーチョキパーを集計すると100%) 2. 機能としては類似ユーザをレコメンドするのみ 3. ユーザ数は1万人ほど という感じです。 動作サーバはまだ決めていないので、スペックは出せません。 言語としてはPythonかRubyで、Webサービスを考えています。 よろしくお願いします。
回答: webサービスの場合は、REDISのようなキャッシュを使うといいと思います。 DJANGOのようなWEBフレームワークを使った場合、そのための関数デコレータがすでに用意されていますが、自分で作るのは難しくないですね。 redisを使った例: ``` import redis cache = redis.StrictRedis(host='localhost', port=6379, db=0) def redis_cache_decorator(f): """Redis Cache Decorator""" def cache_func(*args): key = '-'.join(repr(arg) for arg in args) result = cache.get(key) if result is None: result = f(*args) cache.set(key, result) else: result = int(result) # redisの場合、bytesとした返されるので、変換が必要 print('cache hit!') # for demo only! return result return cache_func @redis_cache_decorator def process_heavy_func(v1, v2): # 処理行う return v1 - v2 process_heavy_func(9, 2) # 結果が計算されて、キャッシュされる process_heavy_func(9, 2) # 同じargsを渡すとキャッシュされた値が返される (cache hit!が表示) ``` 関数デコレータについて