循环函数时是否有更快的方法 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 次循环)

一个区别是现在位置和速度是数组而不是列表。很好,因为您可以节省内存并可以进行批量操作,如果您不尝试追加更多元素,那就太好了。