2016-09-15 6 views
-2

は、私が仕事のこの作品につまずいた:pythonはリスト上のタスクをそれ自身で並列に実行しますか?

def getChild(self, childName): 
    for child in self.children : 
     if(childName == child.data['name']): 
      return child 
    return None 

限りわめき散らすが懸念しているとして、このコードが言うと、このライブラリについて知るためにそこにあるすべてのものを意味します。

事実のほかに

def getChild(self, childName): 
    myChildren = dict([ 
     (child.data['name'],child) 
      for child in self.children 
    ]) 
    try: 
     return myChildren[childName] 
    except: 
     return None 

、読みやすくするために、私は深いのpythonにはないですが、このタスクについて行くのI私の知る限りカノン神託の方法は、

def getChild(self, childName): 
    return (
     [ child for child in self.children 
      if child.data['name'] == childName 
     ] + [ None ] 
     )[0] 

であるか、その私はまだどのようにいつどこでインデントするかについての手がかりがありません{[()]および}私の選択肢は常にすべての要素で動作しますself.children

pythonはこれを認識し、データセットを並列に処理しますか、それともそれでも配列を順番に処理しますか? (したがって、私はそのライブラリで見つけた単純な検索よりも時間がかかります)

実行された検索の量では、リストの代わりに子供の辞書を常に維持するようにライブラリを変更する方がいいですが、ポイントのほかに。私はこのコードをPythonがどのように解釈して処理するのか知りたいです。

+0

コードレイアウトに関する補足として、[PEP 08 - Style Guide for Python](https://www.python.org/dev/peps/pep-0008/#code-lay-out)をチェックしてください。 )。 – Ian

+2

最初のコードブロックは、3つのうちで最も優れています( 'return None'は完全に削除できます)。 – TigerhawkT3

+0

また、Pythonは自動的に何も並列化しません。それがあなたの仕事です。 – TigerhawkT3

答えて

2

いいえ、自動並列化はありません。 Pythonはあなたのコードを効率的に書いていますが、それを計算上効率的にすることはできません。より大きな問題があります:GIL - グローバルインタープリタロック。つまり、一度に1つのスレッドしか実行されません。したがって、PythonのCPU集約型タスクの並列化には大きなポイントはありません。通訳者にはGILはありませんが、一般的な経験則があります.GILについて知らない場合は、それがあります。

あなたが投稿したコードについて:pythonでは、大学で最も愛されている最も一般的な手続きスタイルまたは機能スタイルで書くことができます。任意のものを選択できます。

+0

並列性に関しては、GILが正しい答えです。あなたがPythonで本当の並行性を失うなら、別のPython実装(CythonまたはPyPy)を使う必要があるか、または「マルチプロセッシング」パッケージを利用する必要があるかもしれません。 – rikisa

+0

なぜ、パラレル処理という点ではあまり動作しない場合は「データ」となります。私はマルチプロセスパッケージthougを調べてみることにします。 – user1129682

+0

rikisaはすでに答えているので、ボトルネックを克服する方法があります(スレッドではなく多くのプロセスを使用し、Cで書かれたライブラリを使用することで、マルチスレッドアプリケーションの方がはるかに優れたインタプリタを使用する方法があります)。最悪の場合、パフォーマンスが重視される場合は、常にビジネス上の重大なボトルネックをC++で書き換えることができます。 –

関連する問題