繁体   English   中英

访问2D列表/数组和使用Python进行计算的更快方法?

[英]Faster way to access 2D lists/arrays and do calculations in Python?

我正在运行2个嵌套循环(第一个嵌套120个循环,第二个嵌套500个循环)。 在大多数120x500运行中,我需要访问几个列表和列表中的列表(我将它们称为2D数组)。

目前,120x500运行需要大约4秒钟。 大多数时间是由三个列表附加项和几个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)]

一些一般性提示:

  1. 尽最大可能尝试优化算法。
  2. 如果可能的话,请使用PyPy而不是常规的Python。 如果您所有的外部依赖项都可以使用,则通常不需要任何代码修改。
  3. 对C进行静态类型化和编译可以增加额外的提升,但是需要一些简单的代码修改。 为此,您可以使用Cython

请注意,第1步非常难做,而且最耗时,如果您已经拥有良好的代码,则可以为您带来少量提升,而第2步和第3步却可以为您带来巨大的提升,而无需付出额外的努力。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM