3

いくつかの Python コードを最適化しようとしています。プロファイラーは、SQLAlchemy の _get_col() がパフォーマンスを低下させていることを教えてくれます。コードは次のようになります。

lots_of_rows = get_lots_of_rows()
for row in lots_of_rows:
    if row.x == row.y:
        print row.z

私はコードを調べて、このようにしようとしていました...

lots_of_rows = get_lots_of_rows()
for row in lots_of_rows:
    if row[0] == row[1]:
        print row[2]

...しかし、配列などの行オブジェクトにアクセスするときに、実際にはまだ辞書キーをプルしていることを示すと思われるドキュメントをいくつか見つけました。つまり、行オブジェクトは次のようになります。

'x': (x object)
'0': (x object)
'y': (y object)
'1': (y object)
'z': (z object)
'2': (z object)

その場合、名前ではなく番号で列にアクセスすることでパフォーマンスが向上するとは思えません。辞書のリストではなく、タプルのリストまたはリストのリストとして結果を返すように SA を取得する方法はありますか? あるいは、他の最適化を提案できる人はいますか?

4

4 に答える 4

2

当たり前の答えで申し訳ありませんが、クエリに row.x == row.y がないのはなぜですか? 例えば:

mytable.select().where(mytable.c.x==mytable.c.y)

パフォーマンスが大幅に向上するはずです。残りのドキュメントを読んでください。

于 2009-03-17T22:33:20.943 に答える
1

row.items()はあなたが探しているものだと思います。行の (キー、値) タプルのリストを返します。

リンク

于 2009-03-17T21:25:26.333 に答える
0

どの _get_col が呼び出されているかがわかるように、プロファイラーの結果と '_get_col' 呼び出しに関するスタック トレースを投稿する必要があります。(そして _get_col が本当にボトルネックかどうか)。

sqlalchemy のソースを調べたところ、毎回「lookup_key」(engine/base.py 内) を呼び出している可能性があり、これが列の値をローカルにキャッシュしているように見えます。

row.__props を直接使用してバイパスを試みることができます (非公開なのでお勧めしません)。row.cursor を使用することもできますが、sqlalchemy をバイパスして (SQL 生成を除く)、カーソルを使用して直接作業することで、多くのメリットが得られるようです。 .

-- J

于 2009-03-18T01:51:59.157 に答える