优化双for循环以查找二维数组上特定值的计数

时间:2018-01-26 08:47:49

标签: python arrays list for-loop

要计算船上的number of blank spaces,我每次都需要调用以下代码。

for i in range(game.width):
        for j in range(game.height):
            if game.__board_state__[i][j] == 0:
                blank_spaces += 1

目前game.width = 7game.height = 7。所以有一个复杂度为O(width*height)的循环。是否有内置函数/或任何其他方式,更优化?

1 个答案:

答案 0 :(得分:1)

  

是否有内置函数/或任何其他方式,更优化?

我不这么认为,但尝试一些替代品并没有坏处。

%%timeit
c = 0
for i in board:
    for j in i:
        if j == 0:
            c += 1

10 loops, best of 3: 60.4 ms per loop

选项1
嵌套循环

if

将此号码提交给内存。这是我们比较的基准。

接下来,让我们试试"优化"通过摆脱%%timeit c = 0 for i in board: for j in i: c += (j == 0) 10 loops, best of 3: 99.3 ms per loop 检查。事实证明这会适得其反,让事情变得更糟。

%timeit sum(1 for i in board for j in i if j == 0)
10 loops, best of 3: 62.3 ms per loop

选项2
列表理解

%timeit sum([1 for i in board for j in i if j == 0])
10 loops, best of 3: 58.5 ms per loop

似乎没有更快。但是,您可以构建一个列表(比生成器更快更轻,但消耗更多内存),这实际上似乎可以改善巨大数据的内容(它在较小的数据上仍然不值得)矩阵) -

%timeit np.equal(board, 0).sum()
10 loops, best of 3: 74.8 ms per loop

%timeit (np.array(board) == 0).sum()
10 loops, best of 3: 77.3 ms per loop

选项3
向量化

select name, value 
from( select name, value, ROW_NUMBER() OVER(PARTITION BY name ORDER BY value desc) as rn
from out_pumptable ) as a
where rn = 1

没有bueno。

最后,你的嵌套循环是最快的"在与Big-Oh相关的常数方面。就算法复杂性而言,这些选项都是相同的