機械です。
> 機械さんの発言を参考に
>
> > def has_key2(dict, key):
> > if key in dict.keys():
> > return True
> > else:
> > return False
>
> を、
>
> def has_key2(dict, key):
> if key in dict:
> return True
> else:
> return False
>
> のように書き換えたところ、
>
> has_key: 0.015000104904174805
> has_key2: 0.030999898910522461
>
> has_key2のパフォーマンスが一気に上がりました。
> なんかカラクリあるんですかね。
多分、keys()ではなく、iterkeys()でイテレータ(ジェネレータ?)
を作ってるのではないかと思います。
あとの違いは、Cで実装して、最適化してるかしてないか程度
だと思われます。
あと、本質的な問題ではないのですが、random_str関数は
一定文字数のランダムな文字のリストを作ってると思います
(違ってたらごめんなさい)が、randomモジュールには
「シーケンスの中から一つを選ぶ」choiceという便利なツールが
ありまして、
>>> import random, string
>>> string.letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> SL = string.letters
>>> RS = [''.join((random.choice(SL) for x in range(10))) for y in range(10)]
>>> RS
['whmfEpevDJ', 'BIKCrPlusT', 'mgkAasAKbl', 'llgdKsHbfb', 'tiynuOKdLR', 'rhzjQwjgFv', 'DiNxmECiKq', '
iwArGqwRHc', 'FRCNkUXjvt', 'OwiFcZLfBm']
>>>
range()の中の数字を変えていただければ、比較的手間無しに
一定の文字数の文字のリストが得られます。
※ご存知かもしれませんが、内側のループは、2.4から登場した、
ジェネレータの内包記法です。
rs = lambda a,b:[''.join((random.choice(string.letters) for x in range(a))) for y in range(b)]
あるいは、
def rs(a,b):
return [''.join((random.choice(string.letters) for x in range(a))) for y in range(b)]
で関数化できます。
※もっと便利なの、あったかな?
/機械伯爵/