5

これまでのところ、この問題を心配する必要はありませんでしたが、PyOpenGL でバッファリングする必要がある多数の頂点を使用する必要があり、Python の反復がボトルネックになっているようです。これが状況です。3D ポイントの配列がverticesあり、各ステップで各頂点の色の 4D 配列を計算する必要があります。これまでの私のアプローチは次のとおりです。

upper_border = len(self.vertices) / 3
#Only generate at first step, otherwise use old one and replace values
if self.color_array is None:
     self.color_array = numpy.empty(4 * upper_border)  

for i in range(upper_border):
     #Obtain a color between a start->end color
     diff_activity = (activity[i] - self.min) / abs_diff  
     clr_idx = i * 4
     self.color_array[clr_idx] = start_colors[0] + diff_activity * end_colors[0]
     self.color_array[clr_idx + 1] = start_colors[1] + diff_activity * end_colors[1]
     self.color_array[clr_idx + 2] = start_colors[2] + diff_activity * end_colors[2]
     self.color_array[clr_idx + 3] = 1

今、ループの各ステップから操作を排除するためにできることは他にないと思いますが、そのループを実行するには、より最適なパフォーマンスの方法が必要だと思います。たとえば、JavaScript では同じ計算で 9FPS が生成されるのに対し、Python では 2 ~ 3 FPS しか得られないためです。

よろしく、 ボグダン

4

2 に答える 2

13

このコードを高速化するには、「ベクトル化」する必要があります。NumPy のブロードキャスト ルールを使用して、すべての明示的な Python ループを暗黙的なループに置き換えます。あなたのループのベクトル化されたバージョンを試すことができます:

if self.color_array is None:
     self.color_array = numpy.empty((len(activity), 4))
diff_activity = (activity - self.min) / abs_diff
self.color_array[:, :3] = (start_colors + 
                           diff_activity[:, numpy.newaxis] + 
                           end_colors)
self.color_array[:, 3] = 1

すべての変数が何であるか、コードが何をするべきかわからないため、多くの推測をしなければならなかったことに注意してください。したがって、このコードが実行されることを保証することはできません. これはcolor_arrayより適切と思われるため、2 次元配列に変更しました。これには、おそらくコードの他の部分の変更が必要です (または、配列を再度フラット化する必要があります)。

self.minabs_diffはスカラーであり、他のすべての名前は次の形状の NumPy 配列を参照すると仮定します。

activity.shape == (len(vertices) // 3,)
start_colors.shape == (3,)
end_colors.shape == (3,)

またvertices、1 次元配列のように見えますが、2 次元配列である必要があります。

于 2011-12-12T14:40:13.013 に答える
6
  1. まず第一に:cProfileでコードをプロファイリングします
  2. rangeの代わりにxrangeを使用する必要があります
  3. 各ループで4回リコールすることは避けself.color_array、ループの前にローカル変数を作成して、ループで使用する必要があります。local_array = self.color_array
  4. start_colors[N]およびを事前計算してみてくださいend_colors[N]start_color_0 = start_colors[0]
  5. list.extend()を使用して、ループ内の行を減らしてみてください。

    local_array.extend([
       start_colors_0 + diff_activity * end_colors_0,
       start_colors_1 + diff_activity * end_colors_1,
       start_colors_2 + diff_activity * end_colors_2,
       1
    ])
    
于 2011-12-12T14:39:09.630 に答える