循环函数时是否有更快的方法 return 多个值?
Is there a faster way to return multiple values when looping over function?
positions=[]; velocities=[]
for _ in range(1000):
position, velocity = generateRandomVectors()
positions.append(position)
velocities.append(velocity)
这可以做得更快吗?
例如,在不同阶段附加值,或使用不同类型的循环?
当前时间:
n=100
times = timeit.repeat(lambda: test1(), number=n, repeat=10, timer=time.process_time)
print(min(times)/n)
--- 0.04439204000000018 ---
很快,但我有很多向量要生成。
您可以尝试使用 split
method from the numpy
模块:
from numpy import split, array
position, velocity = split(array(tuple(generateRandomVectors() for _ in range(1000))), 2, 1)
如果您没有numpy
模块,您可以install it通过命令提示符命令
pip install numpy
你应该尽可能使用矢量化
def generateRandomVectors():
return np.random.randn(3), np.random.randn(3)
positions=[]; velocities=[]
for _ in range(1000):
position, velocity = generateRandomVectors()
positions.append(position)
velocities.append(velocity)
每个循环 2.19 ms ± 10.8 µs(7 次运行的平均值 ± 标准偏差,每次 100 次循环)
如果不是每次调用生成一个向量,而是一次调用生成 1000 个向量,那么它在这里的运行速度大约快 15 倍
def generateRandomVectors(n):
return np.random.randn(n, 3), np.random.randn(n, 3)
positions, velocities = generateRandomVectors(1000)
每个循环 145 µs ± 533 ns(7 次运行的平均值 ± 标准差,每次 10000 次循环)
一个区别是现在位置和速度是数组而不是列表。很好,因为您可以节省内存并可以进行批量操作,如果您不尝试追加更多元素,那就太好了。
positions=[]; velocities=[]
for _ in range(1000):
position, velocity = generateRandomVectors()
positions.append(position)
velocities.append(velocity)
这可以做得更快吗? 例如,在不同阶段附加值,或使用不同类型的循环?
当前时间:
n=100
times = timeit.repeat(lambda: test1(), number=n, repeat=10, timer=time.process_time)
print(min(times)/n)
--- 0.04439204000000018 ---
很快,但我有很多向量要生成。
您可以尝试使用 split
method from the numpy
模块:
from numpy import split, array
position, velocity = split(array(tuple(generateRandomVectors() for _ in range(1000))), 2, 1)
如果您没有numpy
模块,您可以install it通过命令提示符命令
pip install numpy
你应该尽可能使用矢量化
def generateRandomVectors():
return np.random.randn(3), np.random.randn(3)
positions=[]; velocities=[]
for _ in range(1000):
position, velocity = generateRandomVectors()
positions.append(position)
velocities.append(velocity)
每个循环 2.19 ms ± 10.8 µs(7 次运行的平均值 ± 标准偏差,每次 100 次循环)
如果不是每次调用生成一个向量,而是一次调用生成 1000 个向量,那么它在这里的运行速度大约快 15 倍
def generateRandomVectors(n):
return np.random.randn(n, 3), np.random.randn(n, 3)
positions, velocities = generateRandomVectors(1000)
每个循环 145 µs ± 533 ns(7 次运行的平均值 ± 标准差,每次 10000 次循环)
一个区别是现在位置和速度是数组而不是列表。很好,因为您可以节省内存并可以进行批量操作,如果您不尝试追加更多元素,那就太好了。