考虑下面的类:建议
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
我用它来计算一个矢量的两个元素之间的距离。我基本上为使用此距离度量的向量的每个维度创建该类的一个实例(有使用其他距离度量的维度)。分析表明,这个类的功能占我knn实现的运行时间的90%(谁会想到)。我不认为有任何纯Python的方式来加速,但也许如果我在C中实现它?
如果我运行一个简单的C程序,它使用上面的公式计算随机值的距离,它比Python快几个数量级。所以我尝试使用ctypes并调用一个执行计算的C函数,但显然参数和返回值的转换远远要昂贵,因为结果代码要慢得多。
我当然可以在C中实现整个kn并且只是调用它,但问题是,就像我所描述的,我使用不同的距离函数来处理矢量的某个维度,并且将这些转换为C会太多工作。
那么我的替代方案是什么?使用Python C-API编写C函数会摆脱开销吗?有没有其他的方法来加速这个计算?
我会建议Cython(答案与示例实现可能会在几分钟内)。我猜你算法已经尽可能地调整过了吗? – delnan 2010-11-21 18:09:24
@delnan:我已经在可能和适当的地方使用了缓存,所以我没有看到任何保存距离计算的方法。 – 2010-11-21 18:17:48
那么......无关,什么是'dataSample'和'var'? – delnan 2010-11-21 18:21:52