1

Python3で奇妙なパフォーマンス「問題」/「ゲイン」に遭遇しました。次のコードは、5 つの重み行列を読み込み、それらをかなり大きなデータセットに適用します。そうしている間に、各行がディスクに書き込まれます。

このプログラムを実行すると、8 つのプロセッサすべてが 100% 占有されます。

Pythonは複数のスレッドでプログラムを自動的に実行しますか? もしそうなら、これに関するドキュメントはありますか? そうでない場合、このプログラムが octcore 上の 8 つのプロセッサすべてを消費するのはどうしてでしょうか?

#!/usr/bin/python3
import numpy
import struct
from scipy.special import expit
from dA import load_data
from dA import load_wb
import sys

if __name__ == '__main__':
   stages=[2223,723,172,84,21]
   wb=[]
   for stage in stages:
      w,b=load_wb("%d" % (stage))
      print(numpy.max(w))
      wb.append((w,b))

   data=load_data()
   n=data.shape[0]
   dimensions=stages[-1]
   filename="%d.data" % (dimensions)
   chunk=">"+('f'*dimensions)
   with open(filename,"wb") as f:
      for i in range(n):
         row=data[i]
         for (w, b) in wb:
            row=2*expit(2*(numpy.dot(row,w)+b))-1
         s=struct.pack(chunk,*row)
         f.write(s)
4

2 に答える 2

1

私は最近、このトピックに関する興味深い記事を読みました。これは、あなたにとって興味深いものになると思います: Python は、複数の CPU コアをネイティブに使用できないために足止めされてきました。現在、Pythonistas は解決策を見つけることを目指しています。あなたの質問に答えるために、記事の最初の段落を引用します。

Python の優れた便利な機能のすべてについて、まだ 1 つの目標が達成されていません。それは、CPython リファレンス インタープリター上で実行され、複数の CPU コアを並列に使用する Python アプリです。... 実際、Python アプリケーションでスレッドを使用することは可能です。多くのアプリケーションでは既に使用されています。不可能なことは、CPython がマルチスレッド アプリケーションを実行し、各スレッドが異なるコアで並列に実行されることです。CPython の内部メモリ管理はスレッドセーフではないため、インタープリターは一度に 1 つのスレッドのみを実行し、必要に応じてスレッドを切り替え、グローバル状態へのアクセスを制御します。

簡単に言えば、Python で複数のスレッドを実行することは可能ですが、現時点では、複数のコアを自動的に並行して使用することはありません。ただし、この機能を実装する作業は開始されています。

また、これは Python のリファレンス実装である CPython に関するものであることを指摘しておく必要があります。残念ながら、他の実装に同じ問題があるかどうかはわかりません。

于 2016-06-14T19:01:55.623 に答える
1

8 つのコアが使用される理由は、Linux では、可能であれば BLAS が自動的にそれらを使用するためです。したがって、プロセッサ時間はほとんど numpy.dot 操作に費やされます。

于 2016-06-14T18:37:36.080 に答える