代码之家  ›  专栏  ›  技术社区  ›  robintw

加速麻木的循环

  •  2
  • robintw  · 技术社区  · 14 年前

    我在用python运行一个模型,并试图加快执行时间。通过分析代码,我发现在 cell_in_shadow 功能如下。我想知道有没有办法加快速度?

    函数的目的是提供一个布尔响应,说明numpy数组中的指定单元格是否被另一个单元格(仅在x方向)隐藏。它通过沿行后退检查每个单元格的高度来实现这一点,使给定的单元格处于阴影中。中的值 shadow_map 由此处未显示的另一个函数计算-对于本例,取 阴影映射 作为一个数组,其值类似于:

    [0] = 0 (not used)
    [1] = 3
    [2] = 7
    [3] = 18
    

    这个 add_x 函数用于确保数组索引循环(使用时钟面算法),因为网格具有周期性边界(任何偏离一边的内容都将重新出现在另一边)。

    def cell_in_shadow(x, y):
       """Returns True if the specified cell is in shadow, False if not."""
    
       # Get the global variables we need
       global grid
       global shadow_map
       global x_len
    
       # Record the original length and move to the left
       orig_x = x
       x = add_x(x, -1)
    
       while x != orig_x:
        # Gets the height that's needed from the shadow_map (the array index is the distance using clock-face arithmetic)
          height_needed = shadow_map[( (x - orig_x) % x_len)]
          if grid[y, x] - grid[y, orig_x] >= height_needed:
              return True
    
        # Go to the cell to the left
        x = add_x(x, -1)
    
    def add_x(a, b):
       """Adds the two numbers using clockface arithmetic with the x_len"""
       global x_len
    
       return (a + b) % x_len
    
    3 回复  |  直到 14 年前
        1
  •  3
  •   Justin Peel    14 年前

    grid[y, orig_x]

    while x != orig_x:
        height_needed = shadow_map[( (x - orig_x) % x_len)]
    

    for i in xrange(x_len-1,0,-1):
        height_needed = shadow_map[i]
    

        if grid[y, x] - grid[y, orig_x] >= shadow_map[i]:
    

    Psyco ?虽然它可能不会给你带来和赛通一样大的速度提升,但它比赛通花费的工作要少。我当然会先试试。

        2
  •  2
  •   user334856    14 年前

    如果您不局限于严格的python,我建议您使用cython。它可以允许索引的静态类型和以C速度高效、直接地访问numpy数组的底层数据缓冲区。

    查看以下网站的简短教程/示例: http://wiki.cython.org/tutorials/numpy

    在这个例子中,它执行的操作非常类似于您正在执行的操作(递增索引、访问numpy数组的各个元素),将类型信息添加到索引变量中会将时间缩短一半。通过给numpy数组提供类型信息,向它们添加有效的索引,可以将时间缩短到原始数组的1%左右。

    大多数python代码已经是有效的cython了,所以您可以只使用您拥有的代码,并在需要的地方添加注释和类型信息,以提高速度。

    我怀疑你会从添加类型信息中得到最多的索引 x , y , orig_x 以及麻木的数组。

        3
  •  1
  •   DaveP    14 年前

    下面的指南比较了几种不同的优化Python中数字代码的方法:

    Scipy PerformancePython

    这有点过时了,但仍然有用。请注意,它指的是Pyrex,正如Sancho所提到的那样,Pyrex从那时起就被用于创建Cython项目。