2016-10-05 4 views
-2

私は多くのパッケージを含むPython(Flask)プロジェクトを持っており、各パッケージはFlaskの青写真です。現在、私は1つのパッケージに項目のリスト(フックされている)を返す関数を持っています。この関数は別のパッケージで呼び出されます(トリガーされます)。このプロジェクトでは、フックとトリガを使用してさまざまなパッケージ間の通信が行われ、プロジェクトの初回起動時にはすべてがメモリにロードされます。この場合ジェネレータを使用することは可能ですか?もしそうなら、この特定のケースではリストではなくジェネレータを使うことが望ましいでしょうか?前もって感謝します!2つのpythonパッケージの間でジェネレータを使用できますか?

これは私が持っているものの単純化された例です。この場合、function1を発電機にすることは可能ですか?

package1.module1:

def function1(): 
    # some_list might be retrieved from a database 
    retrun some_list 

package2.module2:

from package1.module1 import function1 

def func1(): 
    list_from_module_one = function1() 
    # do something with the result 
    # Here I have 2 cases, I can either return "list_from_module_one" as it is 
    # or do something with each item of this list and then return something that is 
    # not directly related to this list 
    return some_data 

def func2(): 
    # Second function that calls function1 from package1 
    list_from_module_one = function1() 
    # do something with the result 
    return some_data 
+0

ここでジェネレータを使用できます。それはあまり役に立たないでしょう。答えが言うように、あなたがしていることを詳しく教えてください。 'function1()'はyieldを使用しなければならないので、今のようにリストとして格納するのではなく関数を反復する必要があります。 –

+0

@JoeDohertyは、私がpackage2の関数で同じデータ(function1の結果)を返したい場合でもfunction1をジェネレータにすることができるということですか?この場合、何が最善のことでしょうか? – ettanany

+1

私はそれがあなたが何をしているのかは分かりません。この関数はリストの代わりにジェネレータを返しますが、それを反復することができます。 https://gist.github.com/docapotamus/896192c5eed7d85854344c436f4806b8 –

答えて

1

ジェネレータがリストの場合は、あなたがそれゆえ必要なメモリを節約し、その場で結果を生成する場合に非常に便利ですそれがすでにメモリにロードされていて、あなたはそれをちょっとした方法で使っているだけです。だから、ジェネレータは複雑さを増やすだけです。また、あなたが扱っているリストのサイズにもよりますが、サイズが小さい場合は、パフォーマンスが重要ではありません。

あなたのリストをオンザフライで作成する場合は、ジェネレータを使用することが賢明です。値の生成が遅れてパフォーマンスが向上します。

私の理解によれば、あなたのプロジェクトの複数の場所で発電機を使用する必要があるので、あなたの質問から明らかでないいくつかの事があります。だからデータ同期もしたいですか?その場合は、同じジェネレータオブジェクトを毎回どこで使用するかを毎回確認する必要があります。

generatorsのこのチュートリアルは良い説明を与えます。

特にコードスニペットを使用して、より正確な回答を得るために質問を詳しく説明してください。

+0

私は自分が持っているものの簡単な例を追加しました。データの同期は望ましくありません。今はっきりすれば教えてください。 – ettanany

+1

はい、ここで使用できますが、データが非常に高い場合や処理ロジックが一度に1つの要素を処理するように設定されている場合は、使用することをお勧めします。 –

+0

よろしくお願いいたします。私はあなたの答えを得た。 – ettanany

関連する問題