3

我对 python 比较陌生,并且对优化和加速此功能的任何想法感兴趣。对于我正在做的数值计算,我必须调用它数万次,它占用了代码总计算时间的主要部分。我已经用 c 编写了这个,但我很想看看有什么技巧可以让它在 python 中运行得更快。

此代码根据http://en.wikipedia.org/wiki/Stereographic_projection计算 bigD 长度向量到 littleD 长度向量的立体投影。变量 a 是一个长度为 96 的 numpy 数组。

import numpy as np 
def nsphere(a):
    bigD = len(a)
    littleD = 3
    temp = a
# normalize before calculating projection
    temp = temp/np.sqrt(np.dot(temp,temp))
# calculate projection
    for i in xrange(bigD-littleD + 2,2,-1 ):
        temp = temp[0:-1]/(1.0 - temp[-1])
    return temp
#USAGE:
q = np.random.rand(96)
b = nsphere(q)
print b
4

1 回答 1

2

这应该更快:

def nsphere(a, littleD=3):
    a = a / np.sqrt(np.dot(a, a))
    z = a[littleD:].sum()
    return a[:littleD] / (1. - z)

请做数学以仔细检查这实际上与您的迭代算法相同。

显然,这里的主要加速将来自这样一个事实,即这是一个 O(n) 算法,它取代了用于计算投影的 O(n**2) 算法。但特别是为了在 python 中加快速度,你想要“矢量化你的内部循环”。意思是尽量避免循环和其他任何会在代码的最关键性能部分产生高 python 开销的东西,而是尝试使用高度优化的 python 和 numpy 内置函数。希望有帮助。

于 2012-11-25T07:58:08.710 回答