要计算船上的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 = 7
和game.height = 7
。所以有一个复杂度为O(width*height)
的循环。是否有内置函数/或任何其他方式,更优化?
答案 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相关的常数方面。就算法复杂性而言,这些选项都是相同的。