文字列整形式

「入門自然言語処理」p.177にて。

timeitモジュールを使って、list,set型のオブジェクトの中にある要素が存在しているかどうか、のチェックに要する処理速度を比較するところ。

本の通りにプログラムを打ち込んで実行すると、、

Traceback (most recent call last):
File "prac0321.py", line 8, in
print Timer(statement,setup_list).timeit(1000)
File "C:\Python26\lib\timeit.py", line 193, in timeit
timing = self.inner(it, self.timer)
File "", line 6, in inner
NameError: global name 'vocabrandom' is not defined

vocabrandomが定義されていない??

試行錯誤すると、この行

statement = "random.randint(0,%d) in vocab" % vocab_size * 2

において、%が*よりも優先順位が高いため、vocab_sizeを%dに代入した後、文字列全体を2倍するという挙動になってしまっていて、つまりstatementが

random.randint(0,10000) in vocabrandom.randint(0,10000) in vocab

という文字列になってしまっていたのでした。以下のように修正しO.K.

statement = "random.randint(0,%d) in vocab" % (vocab_size * 2)

しかし、肝心の処理速度の違い、setが遥かに速い理由が今ひとつピンと来ない。今の理解として、「set型は中身の検索がなぜか超速い!!」程度にして後に理解できる時が来るのを待とうと思います。