我的程序中有一个函数可以计算出相关系数。它需要两个平面(一维)numpy数组,并对它们执行必要的计算,以计算出两个数字列表(它们是货币,属于float类型)之间的相关性。只要程序运行,这个函数每个循环执行136次,每个循环大约需要0.05秒。以下代码按预期计算系数:
def CC(a, b):
a = a - np.mean(a)
b = b - np.mean(b)
ab = np.sum(a*b)
asq = np.sum(a**2)
bsq = np.sum(b**2)
cc = round(ab / sqrt(asq * bsq), 5)
return cc
但是它最终会导致内存泄漏。解决此内存泄漏的方法是将函数更改为:
def CC(a, b):
cc = round(np.sum((a - np.mean(a)) * (b - np.mean(b))) / sqrt(np.sum(a**2) * np.sum(b**2)), 5)
return cc
它只在一行中完成,并且不创建任何新的列表,因此节省了内存并避免了泄漏。你知道吗
然而,由于一些奇怪的原因,当使用方法2时,返回值从0.1开始,然后在大约20秒的时间内下降到0,然后从那时起保持在0。每次都是这样。我也尝试过方法2的替代方法,即1或2个额外的计算步骤-同样的结果。我已经通过消除过程隔离了所有可能的错误源,所有这些都归结为函数本身内部发生的事情,所以这肯定是个问题。到底是什么原因造成的?就好像CC函数忽略了它给出的输入。。。如果是以某种方式设置的。。?你知道吗
您的代码不相等,第一个代码在第一步中重新分配
a
和b
:所有后续操作都使用更新的
a
和b
。然而,您的第二种方法只是在sqrt
术语中忽略了这些:应与以下内容相同:
一些补充意见:
这不是真的(至少不总是这样),它仍然会产生新的数组。但我可以看到两个可以避免创建中间数组的地方:
同样适用于
b = b - np.mean(b)
我在第一个函数中找不到任何内存泄漏的证据。你知道吗
如果您关心中间数组,您可以自己进行操作。我用numba来显示它,但是这可以很容易地移植到cython或类似的地方(但是我不需要添加类型注释):
并将性能与您的两个功能进行了比较:
并确保结果一致,然后计时:
相关问题 更多 >
编程相关推荐