我需要在Python项目中每天进行几亿次欧几里得距离计算。
以下是我最初的代码:
def euclidean_dist_square(x, y):
diff = np.array(x) - np.array(y)
return np.dot(diff, diff)
这非常快,而且我已经不再进行平方根计算,因为我只需要对项目进行排名(最近邻搜索)。虽然如此,它仍然是脚本的瓶颈。因此,我编写了一个C扩展程序,用于计算距离。计算始终使用128维向量。
#include "euclidean.h"
#include <math.h>
double euclidean(double x[128], double y[128])
{
double Sum;
for(int i=0;i<128;i++)
{
Sum = Sum + pow((x[i]-y[i]),2.0);
}
return Sum;
}
这个扩展的完整代码在这里:https://gist.github.com/herrbuerger/bd63b73f3c5cf1cd51de
现在与numpy版本相比,这确实可以提供很好的加速。
但是是否有任何方法可以进一步加速(这是我第一次使用C扩展,所以我假设有)?由于该函数每天使用的次数很多,每微秒实际上都会带来好处。
你们中的一些人可能会建议将这个函数从Python完全移植到另一种语言,不幸的是,这是一个更大的项目,不是一个选项 :(
谢谢。
编辑
我已经在CodeReview上发布了这个问题:https://codereview.stackexchange.com/questions/52218/possible-optimizations-for-calculating-squared-euclidean-distance
如果有人已经开始回答,我将在一个小时内删除此问题。
-O1
的情况下,GCC也会消除那个pow
调用。 - Fred Foo