如何使迭代更快?
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.worldWidth
和 self.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。
我有这个循环:
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.worldWidth
和 self.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。