旅音

旅行・地ビール・投資・音楽・IT・本などなど

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Dropboxのインターン生が、自前のescape関数を最適化していたので個人用にメモ(違うとこがあるかも)。
http://tech.dropbox.com/?p=89

以下、紹介されていた手法を箇条書き。
・関数呼び出しの除去(Inlining)
・関数呼び出しは遅いので内部化する
・検索はlistよりもsetを使う
・ループをリスト内包化(Implicit loop)
 →forループをリスト内包にする。generator expressionだとgeneratorオブジェクトが生成されるので、リスト内包より遅くなる場合がある
・グローバル変数を利用しない
 →LOAD_FASTよりLOAD_GLOBALのほうが遅い(逆アセンブルで表示されるニーモニック)
・文字列フォーマット("v=%d" % val)よりも加算("v="+val)が速い
・同じ計算が複数回行われる場合はキャッシュを使う
・cで実行される組み込み関数を出来る限り使う
・c言語で書きなおす(ブログ内ではやってない)
・テストデータによって性能にムラが出る場合があるので、実際のありそうなデータが来た場合に一番速いものを採用する
スポンサーサイト

cssのスタイルの優先度は
タグに指定された値
HTMLファイルに指定された値
外部cssに指定された値
だけれども、以下のような記述(!important)をすると、そのスタイルが最優先になる

span#hoge {

color: white !important;

}



<span id="hoge" style="color: black">HOGE</span>

この場合、通常ならばspanタグの色は黒になるが、importantの効果でwhiteが優先される。

当然、タグの方にもimportantがつけばタグの方が優先される。

pythonでjsonを扱う際に利用されるsimplejsonで、

simplejson.loads(str)

をすると、ユニコード文字列表現のもの(もしくは処理する上でunicode化が必要なマルチバイト文字)はunicodeオブジェクト化されるが、そうでないものはstrオブジェクト化される。

>>> jsonObj = simplejson.loads('{"hoge": "\u304a\u7c73", "ほげ": "fuga"}')
>>> for k, v in jsonObj.iteritems():
... print "key: %s, type: %s" % (k, type(k))
... print "value: %s, type: %s" % (v, type(v))
...
key: ほげ, type: <type 'unicode'>
value: fuga, type: <type 'str'>
key: hoge, type: <type 'str'>
value: お米, type: <type 'unicode'>


unicodeとstrを分けて使うような場合は気にしないといけない。
例えば、戻ったdictオブジェクトの各バリューを引数に、unicodeオブジェクトを引数として期待するような関数を使う場合とか。

apache2.x上で、Genshiをimportすると動かない、という現象に出くわした。
apacheのエラーログによると、

「httpd: Objects/stringobject.c:115: PyString_FromString: Assertion `str != ((void *)0)' failed.」

とのこと。なんのこっちゃさっぱりと思って調べてみると、原因は、
「pythonの使うpyexpatライブラリとapacheの読みこむexpatモジュールのバージョンがずれている」
とのことでした。

pythonの使っているpyexpatのバージョンと、apacheの使用しているexpatのバージョンの調べ方は以下リンクに詳しい。
http://code.google.com/p/modwsgi/wiki/IssuesWithExpatLibrary

ずれている場合はapache側のexpatモジュールのバージョンを合わせるのが簡単だそう。詳細は以下。
http://d.hatena.ne.jp/shimooka/20080123/1201100101

結構はまった。

端的に言うと、
・__getattr__
未定義のメンバーにアクセスする際に呼び出される

・__getattribute__
未定義・定義済み関わらず、すべてのメンバーアクセスで呼び出される。



やってみる。

・__getattr__
>>> class Test(object):
... def __getattr__(self, name):
... print "getattr"
... return 100
...
>>>
>>> t = Test()
>>> t.x      ・・・(1)
getattr
100
>>> t.x = 1
>>> t.x      ・・・(2)
1

変数xが未定義の状態では__getattr__が呼び出されているが(1)、xが定義されると無視される。(2)


・__getattribute__
>>> class Test(object):
... def __getattribute__(self, name):
... print "getattribute"
... return object.__getattribute__(self, name)
...
>>>
>>> t = Test()
>>> t.x      ・・・(1)
getattribute
Traceback (most recent call last):
File "", line 1, in
File "", line 4, in __getattribute__
AttributeError: 'Test' object has no attribute 'x'
>>> t.x = 1    ・・・(2)
>>> t.x
getattribute
1

未定義時(1)、定義済み時(2)関わらず__getattribute__が呼び出されている。

ちなみに__getattribute__でobject.__getattribute__としているのは無限ループ回避のため。
__getattribute__内で、
getattr(self, name)
などとすると、再び__getattribute__が呼ばれてしまうので。

以上。

カウンター

RSSリンクの表示

リンク

このブログをリンクに追加する

Zorg

旅先で撮った写真が主です。

ブクログ

ブロとも申請フォーム

お気軽にどうぞ!

Copyright ©旅音. Powered by FC2 Blog. Template by eriraha.

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。