我正在玩numpy来模拟N维空间。请注意,与现有软件相比,我并没有认真尝试制作高效的东西,我只是想在这里学习一些东西。
那就是说,我仍然对设计这种算法的最佳方式感到好奇。
空间模拟往往需要大量的标准化计算。
因此,假设为了处理1秒的模拟,计算机需要进行100次归一化计算。
Numpy能够同时对大量矢量进行标准化。而且我猜测运行100个规范的计算要快得多,那么每个计算运行100个计算就会更快。
保持“矢量规范化”的全局列表是否有意义,然后在模拟的每一秒结束时立即处理它们?或者这种方法的好处并不重要?
我猜这取决于运行计算的确切开销。我在这里走在正确的轨道上吗?
答案 0 :(得分:2)
如果不执行任何计时测试(你应该自己做),我会说将所有向量累积到一个更大的数组然后通过一次调用numpy' s来处理它们会更快{1}}功能。我怀疑用于将这些向量分配给累加器数组的相应元素的时间小于numpy的norm
使用的开销。这完全基于我的直觉和#34;并且应该进行时间测试。
norm
所以,似乎这个特定的测试显示我是正确的,并且将所有向量累积到一个更大的矩阵中并且一次在所有向量上运行In [1]: import numpy as np
In [2]: def f1(vectors):
...: vectors = np.asarray(vectors, dtype=np.float64)
...: acc = np.empty_like(vectors)
...: for k in range(len(vectors)): # just force standard for loop
...: acc[k, :] = vectors[k]
...: return np.linalg.norm(acc, axis=1)
...:
In [3]: def f2(vectors):
...: vectors = np.asarray(vectors, dtype=np.float64)
...: norm = np.empty(len(vectors), dtype=np.float64)
...: for k in range(len(vectors)): # just force standard for loop
...: norm[k] = np.linalg.norm(vectors[k])
...: return norm
...:
In [4]: v = np.random.random((1000, 3))
In [5]: %timeit f1(v)
953 µs ± 16.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [6]: %timeit f2(v)
4.02 ms ± 89.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
更有效(对于这个特定的例子,为4倍) ,载体数量等。)