如何使迭代更快?

How to make iterating faster?

我有这个循环:

for i in range(self.worldWidth):
    for j in range(self.worldHeight):
        originalValue = self.world.world[i, j]
        # Process newValue
        self.world.world[i, j] = newValue
        

当世界大小为 (500, 500) 时,它每秒运行大约 10 次,这对我正在做的事情来说很慢,当我尝试在 C# 中做同样的事情时,我得到了三倍的速度 (30每秒次数)。
有没有办法让它更快?

注意:这些速度是在未对值进行任何操作的情况下计算得出的

编辑:在用 C# 进一步测试后,我得到了大约 10 倍的速度(只是第一次很慢),但在 python 中每次大约 0.07 秒

也许可以通过使用 range 关键字将 self.worldWidthself.worldHeight 声明为带有插入数字的列表。 这将在每次迭代时保存 next() 数字的计算。

注意 - 与使用循环中下一个索引计算的范围选项相比,这种方式会导致内存浪费。

不知道你要做什么,但以 numpy 标签为指标。 Numpy 在编译代码中运行它的内部循环,因此比使用显式 Python 循环快得多。

import numpy as np

world = np.zeros( ( 500, 500 ) )

world[:] = 42

def test( world, v ):
    for r, row in enumerate( world ):
        for c, col in enumerate( row ):
            world[ r, c ] = v 

test( world, 42 )

%timeit world[:] = 42                                                   
# %timeit 110 µs ± 1.58 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%timeit test( world, 43 )                                               
# 69.9 ms ± 1.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

如果您需要计算,如果它们可以在 numpy 中定义,它们也可以更快。

weight = np.arange( 500 )/250

def test_loop( world, weight ):
    w = world.copy()
    for r, row in enumerate( world ):
        for c, col in enumerate( row ):
            w[ r, c ] *= weight[c]
    return w

test_loop( world, weight )

def test_np( world, weight ):
    w = world.copy()
    return world * weight

np.isclose( test_loop( world, weight ),test_np( world, weight )).all()
# True  # The two results are equivalent.

%timeit test_np( world, weight )                                        
# 754 µs ± 1.71 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit test_loop( world, weight )                                      
# 172 ms ± 3.62 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

正如一些评论所暗示的那样。这取决于您需要生成什么计算 newValue。考虑到计算时间的潜在改进,可能值得为您的应用程序探索 numpy。