【问题标题】:Optimizing Vector Normalization on Numpy在 Numpy 上优化向量归一化
【发布时间】:2018-04-09 17:01:49
【问题描述】:

我正在使用 numpy 来模拟 N 维空间。请注意,与现有软件相比,我并没有认真尝试制作更高效的东西,我只是想在这里学习一些东西。

也就是说,我仍然对设计此算法的最佳方法感到好奇。

空间模拟往往需要大量的归一化计算。

所以,假设要处理 1 秒的模拟,计算机需要进行 100 次归一化计算。

Numpy 能够一次对大量向量进行归一化。而且我猜测运行一次 100 个范数的计算会比每次运行 100 个范数的 1 个范数要快得多。

保留“要归一化的向量”的全局列表,然后在每一秒模拟结束时一次性处理它们是否有意义?还是这种方法的好处并不显着?

我猜这取决于与运行计算相关的确切开销。我在正确的轨道上吗?

【问题讨论】:

    标签: python numpy vector


    【解决方案1】:

    在不执行任何时序测试(您绝对应该自己进行)的情况下,我会说将所有向量累积到一个更大的数组中,然后通过一次调用 numpy 的 norm 函数来处理所有向量会更快。我怀疑用于将这些向量分配给累加器数组的相应元素的时间小于 numpy 的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)
    

    所以,这个特定的测试似乎表明我是对的,并且将所有向量累积到一个更大的矩阵中并同时在所有向量上运行 numpy.linalg.norm() 效率更高(对于这个特定示例,数字是 4 倍向量等)

    【讨论】:

    • 嗯,我会做一些进一步的测试,但这似乎是我要找的,谢谢。我不确定我正在考虑的方法是否合理。不过,对于阅读本文的其他人,我会指出,如果速度是目标,则可能不应该使用 linalg.norm。这个问题展示了一些更快的选择:stackoverflow.com/questions/2850743/…
    • @someone-or-other 感谢您接受我的回答。绝对可以通过多种方式对向量进行归一化——我只是选择了一种来进行说明。我强烈建议您为您的特定 python/numpy 版本运行一些基准测试,因为各种计算规范方法的性能可能会随版本而变化。因此,如果您使用不同的计算规范的方法,我的小实验的结论可能会改变。例如,如果不同的方法具有非常小的调用开销,您将不会看到 4 倍的性能提升,但会更小。
    • 我当然需要运行更多测试,是的。我想我只是在问我提出的方法是否明智,或者我是否缺少一些基本的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2013-03-30
    • 1970-01-01
    • 2016-05-08
    • 2017-03-28
    相关资源
    最近更新 更多