【问题标题】:Speed issues with pythonpython的速度问题
【发布时间】:2021-03-11 17:59:51
【问题描述】:

我正在努力加快我的 Python 代码的速度。我认为我的代码的主要瓶颈位于以下函数中,其中 k 是计数器,m 是空矩阵,image3 是包含 0 和 1 的矩阵。你有什么建议吗? p.s 我已经尝试使用 Cython 但没有取得多大成功,所以我想知道是否有一些更简单的方法来解决这个问题。提前感谢您的帮助。

    def make_step(k,m,image3):
     
      for i in range(len(m)):
         
        for j in range(len(m[i])):
          if m[i][j] == k:
             
            if i>0 and m[i-1][j] == 0 and image3[i-1][j] == 0:   
              m[i-1][j] = k + 1  
              
               
            if j>0 and m[i][j-1] == 0 and image3[i][j-1] == 0:
              m[i][j-1] = k + 1  
              
             
            if i<len(m)-1 and m[i+1][j] == 0 and image3[i+1][j] == 0:
              m[i+1][j] = k + 1   
              
             
            if j<len(m[i])-1 and m[i][j+1] == 0 and image3[i][j+1] == 0:
              m[i][j+1] = k + 1   
    

【问题讨论】:

  • 我投票结束这个问题,因为您的代码有效,但您正在寻找代码审查。因此这个问题属于:codereview.stackexchange.com
  • 您能否分享一下如何在此函数之外更改 k 变量的完整示例?
  • mimage3 numpy 矩阵吗?还是列表?
  • 另外,你说m 是空的,但你的意思是它最初是一个零矩阵吗?然后随着k的增加逐步更新?
  • 回答this question 可能会有所帮助

标签: python performance


【解决方案1】:

我同意 Booboo,您的代码需要审查,我建议以下方法:

做一个好的基准来看看时间花在了哪里。对于这类问题perf_tool 是为此设计的有效工具[*]。 在您知道代码缺少的地方之后,您可以使用掩码方法在矢量中重写内部循环。这可以让您将问题从 O(n*m) 减少到 O(n)

[*]我是perf_tool的主要开发者

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2011-05-15
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多