3

ここで 2 つの質問があります。
事はこれです:私はそのオブジェクトを使用したすべての人のIDを格納するint値を持つオブジェクトを持っています。これは、フラグ技術 (個人 ID は 0-10) を使用して行われます。

この値に 1 つの ID しかフラグが立てられていない場合、この ID を取得したいという状況になりました。

私が使用した最初のテストvalue & (value-1)は素晴らしいですが、2番目のことに関しては、それを行うための最良の方法は何だろうと思い始めました(私がそれについて疑問に思っている理由は、この計算がクリティカルで1秒間に少なくとも300回発生するためです)場所)。

だから私が考えた最初の方法は を使用するmath.log(x,2)ことですが、非常に単純なビット操作ではなく、値に「難しい」数学が含まれているため、このソリューションには少し不快に感じ、何かが欠けているように感じます。

私が考えた2番目の方法は、value<<11になるまでカウントすることですが、ベンチマークテストでわかるように、それはさらに悪いことでした.

私が実装された3番目の方法は非計算方法であり、最速であり、ID 0〜10のすべての可能な値を持つ辞書を使用しています。

前に言ったように、純粋なPythonでそれを行うための「正しい」方法はありますか?
辞書ベースのソリューションは「正当な」ソリューションですか? (読みやすさ/その他の理由は?)

import math
import time

def find_bit_using_loop(num,_):
    c=0
    while num!=1:
        c+=1
        num=num>>1
    return c

def find_bit_using_dict(num,_):
    return options[num]

def get_bit_idx(num, func):
    t=time.time()
    for i in xrange(100000):
        a=func(num,2)
    t=time.time()-t
    #print a
    return t

options={}
for i in xrange(20):
    options[1<<i]=i

num=256
print "time using log:", get_bit_idx(num, math.log)
print "time using loop:", get_bit_idx(num, find_bit_using_loop)
print "time using dict:", get_bit_idx(num, find_bit_using_dict)

出力:

time using log: 0.0450000762939
time using loop: 0.156999826431
time using dict: 0.0199999809265

(ここに非常によく似た質問があります: Python で最下位ビットのインデックスを返しますが、最初に、この場合、フラグが立てられたビットが 1 つしかないことを知っており、次に、純粋な python ソリューションを維持したいと考えています)

4

1 に答える 1