1

2 つの入れ子になったループを実行しています (最初のループは 120 回、2 回目は 500 回)。120x500 の実行のほとんどで、いくつかのリストとリスト内のリストにアクセスする必要があります (これらを 2D 配列と呼びます)。

現在、120x500 の実行には約 4 秒かかります。ほとんどの時間は、3 つのリスト追加といくつかの 2D 配列アクセスに費やされます。配列は、ループの外側で事前に入力されています。

これが私のコードです:

    #Range from 0 to 119
    for cur_angle in range(0, __ar_angular_width-1):

        #Range from 0 to 499
        for cur_length in range(0, int(__ar_length * range_res_scale)-1):

            v_x = (auv_rot_mat_0_0*self.adjacent_dx[cur_angle][cur_length])+(auv_rot_mat_0_1*self.opposite_dy[cur_angle][cur_length])
            v_y = (auv_rot_mat_1_0*self.adjacent_dx[cur_angle][cur_length])+(auv_rot_mat_1_1*self.opposite_dy[cur_angle][cur_length])

            v_x_diff = (v_x+auv_trans_x) - ocp_grid_origin_x
            v_y_diff = (v_y+auv_trans_y) - ocp_grid_origin_y

            p_x = (m.floor(v_x_diff/ocp_grid_resolution))
            p_y = (m.floor(v_y_diff/ocp_grid_resolution))

            data_index = int(p_y * ocp_grid_width + p_x)

            if data_index >= 0 and data_index < (len(ocp_grid.data)-1):
                probability = ocp_grid.data[data_index]

                if probability == 100:
                    if not m.isnan(self.v_directions[cur_angle]):
                        magnitude = m.pow(probability, 2) * self.magnitude_ab[cur_length]

                        ov_1 = self.v_directions[cur_angle]
                        ov_2 = magnitude
                        ov_3 = self.distances[cur_length]

                        obstacle_vectors.append(ov_1)
                        obstacle_vectors.append(ov_2)
                        obstacle_vectors.append(ov_3)

time.time() とビルドの違いを介して処理時間を把握しようとしましたが、信頼できるものではありませんでした。計算された時間はかなり変動していました。

私は実際には Python のプロではないので、アドバイスは大歓迎です。コードを高速化する方法はありますか?

編集:配列の初​​期化は、次のコードで行われました:

        self.adjacent_dx = [i[:] for i in [[0]*(length_iterations-1)]*(angular_iterations-1)]
        self.opposite_dy = [i[:] for i in [[0]*(length_iterations-1)]*(angular_iterations-1)]
4

1 に答える 1

2

一般的なヒント:

  1. できる限りアルゴリズムを最適化してください。
  2. 可能であれば、通常の Python の代わりにPyPyを使用してください。すべての外部依存関係が機能する場合、これは通常、コードの変更を必要としません。
  3. 静的な型付けと C へのコンパイルは、さらにブーストを追加できますが、簡単なコード変更が必要です。この目的のためにCythonを使用できます。

ステップ 1 は実行するのが非常に難しく、最も時間がかかることに注意してください。すでに優れたコードがある場合は、わずかな改善が得られますが、ステップ 2 と 3 では、追加の労力をあまり必要とせずに劇的な改善が得られます。

于 2013-08-26T10:08:12.257 に答える