考虑以下类:
我用它来计算矢量中两个元素之间的距离。基本上,我为使用此距离度量的矢量的每个维度创建该类的一个实例(有使用其他距离度量的维度)。分析显示,该类的
如果我运行一个简单的C程序,只是使用上述公式计算随机值之间的距离,它比Python快几个数量级。因此,我尝试使用ctypes并调用执行计算的C函数,但显然参数和返回值的转换太昂贵了,因为生成的代码要慢得多。
当然,我可以在C中实现整个knn并调用它,但问题是,正如我所描述的,我对一些向量的维度使用不同的距离函数,将这些函数转换为C将是太多的工作。
class SquareErrorDistance(object):
def __init__(self, dataSample):
variance = var(list(dataSample))
if variance == 0:
self._norm = 1.0
else:
self._norm = 1.0 / (2 * variance)
def __call__(self, u, v): # u and v are floats
return (u - v) ** 2 * self._norm
我用它来计算矢量中两个元素之间的距离。基本上,我为使用此距离度量的矢量的每个维度创建该类的一个实例(有使用其他距离度量的维度)。分析显示,该类的
__call__
函数占据了我的knn实现运行时间的90%(谁会想到)。我不认为有任何纯Python方法可以加速此过程,但如果我在C中实现它呢?如果我运行一个简单的C程序,只是使用上述公式计算随机值之间的距离,它比Python快几个数量级。因此,我尝试使用ctypes并调用执行计算的C函数,但显然参数和返回值的转换太昂贵了,因为生成的代码要慢得多。
当然,我可以在C中实现整个knn并调用它,但问题是,正如我所描述的,我对一些向量的维度使用不同的距离函数,将这些函数转换为C将是太多的工作。
那么我的选择是什么?使用Python C-API编写C函数是否可以摆脱开销?还有其他方法可以加快这个计算吗?
__call__()
表达式返回的计算结果就像这样写的一样吗(u - v) ** (2 * self._norm)
?请参考这里的运算符优先级表。 - martineau3**2*4
得到的是36
,而3**(2*4)
得到的是6561
。这与你提供的链接所描述的是一致的。 - Björn Pollex