投稿数 - 437, コメント - 59536, トラックバック - 156

オブジェクトのキャッシュ

Windows Live Writer で遊んでいたら、間違って前回の記事を消してしまった。復活できると若干嬉しい(中さん宛)。

取り敢えず、前回の記事が不正確だった事を詫びる。概、間違いではないのだが、不十分な説明のため誤解を招く恐れがあるのでここで補足したい。

Python では以下が成り立つと書いた。

a = 10
b = 10

上記は確かに成り立つが、これはキャッシュするに値する数値の場合だけだ。Python 2.5 で一体幾らの数値までキャッシュするのか検証してみよう。まずは Python のおさらい。

>>> a = 10
>>> b = a
>>> a is b
True

is 演算子は変数が同じリファレンスを持っている場合 True となる。そして以下は数値がキャッシュされているので成り立つ。

>>> a = 10
>>> b = 10
>>> a is b
True

続けよう。

>>> a = 999
>>> b = 999
>>> a is b
False

と、これだけで気付いたと思う。おそらく 1 byte で納まる範囲をキャッシュしている。

>>> a = 255
>>> b = 255
>>> a is b
True
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

…あれ?256 は 1 byte に納まらないんですけど…。

文字列も同様で、ある程度の長さの文字列はキャッシュされ、同じインスタンスが使いまわされる。このように、ある程度の大きさの数値や文字列はキャッシュされるのだ。

Jitta さんから質問があったので以下も載せておく。

>>> a = 10
>>> b = 10
>>> a = b + 1
>>> c = 11
>>> a is c
True

ところで、.NET の String Intern pool はどんなに長い文字列でもプールするのだろうか?知っての通り、文字列の比較はコストが高い。しかも長い文字ほどプールに存在する確率は低くなるだろう。 如何なる文字列もプールし、如何なる文字列もプールから探すのだろうか?

この話は次回予定(たぶん)。

投稿日時 : 2007年1月25日 0:46

フィードバック

# re: オブジェクトのキャッシュ

>…あれ?256 は 1 byte に納まらないんですけど…。
Python の実装知らないんだけど、0だけ特別扱いしてる可能性が高いかもw
#Not Int 以外も 0 のエリアが同じとカw
であれば、数値キャッシュに使う0 は、数値としての0としては使えないから余ることになって結果256にしてる可能性がありますw

ま、実装知らないからさっぱり~ではありますがww
2007/01/25 11:10 | とっちゃん

# re: オブジェクトのキャッシュ

>…あれ?256 は 1 byte に納まらないんですけど…。
マイナス方向はどうなんだか興味津々。
2007/01/25 13:53 | 刈歩 菜良

# re: オブジェクトのキャッシュ

>Python の実装知らないんだけど、0だけ特別扱いしてる可能性が高いかもw
0は特別扱いという大いにはあり得ますね。その内実装を調べてみたいですね。

>マイナス方向はどうなんだか興味津々。
実験の結果、-5 までキャッシュしてました。ますますルールがわかりません。
2007/01/25 20:03 | 囚人

# re: オブジェクトのキャッシュ

> 実験の結果、-5 までキャッシュしてました。ますますルールがわかりません。
ますます興味津々です。
(^o^)
2007/01/25 23:54 | 刈歩 菜良

# re: オブジェクトのキャッシュ

ありゃ。-5 ~ 256 までがキャッシュされたのか。。。ってことは、単純なバイトデータではないのかな?
もしかして、固定的に用意されてるのかもw

LLの領域というか使われ方からするとあんまり大きなマイナス値は出てこないだろうとか、そういうところもありそうな気がするw
2007/01/26 11:22 | とっちゃん

# re: オブジェクトのキャッシュ

もう、お二人は当然 Python をインストールしましたねw
是非、一緒に遊びましょう。
2007/01/26 21:45 | 囚人

# thosvAbzydBDxky

t72pss I must admit, the webmaster is a cool guy..!

コメントの投稿

タイトル
名前
URL
コメント