作者: 機械伯爵
日時: 2005/11/22(13:49)
 機械です。

> 機械さんの発言を参考に
> 
> > 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)]

 で関数化できます。

※もっと便利なの、あったかな?

 /機械伯爵/