2

JSONの行から多くのインスタンス化を行うクラスがあります。何かのようなもの:

class Something:
    def __init__(self, json):
        #load all self variables from simplejson.loads(json) here
        print self.some_variable_loaded_from_json

このクラスは1秒間に数百回読み込まれるため、これをできるだけ効率的にしたいと思います。simplejsonから生成されたディクショナリでキーと値のペアを使用してforループを実行できることは知っていますが、simplejsonをそのO(n)オーバーヘッドなしでクラス変数に直接ロードする方法があれば、それは素晴らしいことです。

4

2 に答える 2

9

JSONデータをPythonオブジェクトにロードするだけの場合は、関連するディクショナリをメソッドに渡すだけです。渡されたディクショナリで__init__インスタンスをオーバーライドできます。__dict__

>>> import json
>>> json_data =  '{"a": "my data"}'
>>> data = json.loads(json_data)
>>> class AutoVar(object):
...   def __init__(self, data):
...       self.__dict__ = data
... 
>>> test = AutoVar(data)
>>> test.a
u'my data'
于 2012-09-22T02:25:53.233 に答える
2

データを一度ロードしてキャッシュしておくか、のインスタンス化ごとにJSONBLOB全体をループする必要がありますSomething。残念ながら、SimpleJsonは「オブジェクトキャッシュ」などを維持していません(Pythonの他のJSONライブラリも維持していません)。JSON BLOBからデータを再度取得するには、BLOB自体(またはファイルが何であれ)を再解析する必要があります。

私がお勧めするのは、これらの変数をJSONから各インスタンスではなくクラスに、必要な場合にのみ追加することです。例えば:

class Something(object):
    @classmethod
    def _load_from_json(cls, blob):
        for k, v in blob.iteritems():
            setattr(cls, k, v)

の呼び出し_load_from_jsonは比較的コストがかかりますが、JSON自体が変更されるたびに呼び出す必要があります。そうすれば、のすべてのインスタンスSomethingが属性のようにデータにアクセスできるようになります。

同様に、ここでファイルを見ている場合、私は最近、YAMLファイルへのリアルタイムのオブジェクトのようなアクセスを可能にする要点を公開しました(ただし、実際にはコードで交換することができyamlますjson)。それはあなたが探していることをするかもしれません。

于 2012-09-22T01:39:01.650 に答える