所以,我正在编写一些集成代码,并加快它尝试使用ctypes。但代码使用的内存不断增加最终耗尽(通过观看顶部和最终杀死我的脚本确认)。这是我到目前为止所得到的:
import numpy as np
import scipy.integrate as integrate
import ctypes
lib=ctypes.CDLL('/path/to/testIntDist.so')
cFunc=lib.intBin
cFunc.restype=ctypes.c_double
cFunc.argtypes=(ctypes.c_int,ctypes.c_double)
def pyFunc(x1,x2,x3):
x=(x1**x2)*np.log10(x3)
return x
def intFunc(x1min,x1max,x2min,x2max,x3min,x3max):
x=integrate.nquad(cFunc,[[float(x1min),float(x1max)],[float(x2min),float(x2max)],[float(x3min),float(x3max)]])[0]
return x
line='1.0 1 1 1 1 0.1 0.111178446136 0.1 0.111178446136 3.0 3.1299027994'
for i in range(1,50000):
x=list(line.split())
res=intFunc(x[5],x[6],x[7],x[8],x[9],x[10])
print(res)
testIntDist.c在哪里:
#include <stdlib.h>
#include <math.h>
double intBin(int n, double args[n]){
double x1,x2,x3;
x1=args[0];
x2=args[1];
x3=args[2];
return pow(x1,x2)*log10(x3);
}
编译:
gcc -O2 -shared -fPIC -o testIntDist.so testIntDist.c -lm
代码版本:
gcc 4.6.3
python 3.2.3
scipy 0.15.1
如果我从cFunc切换到pyFunc(即函数的python版本),则内存使用率在运行期间保持不变。在调用cFunc释放内存后,我应该做些什么吗?
在print语句之后添加gc.collect()以强制进行垃圾回收,没有帮助。并使用memory_profiler
运行Line # Mem usage Increment Line Contents
================================================
16 36.836 MiB 0.000 MiB @profile
17 def intFunc(x1min,x1max,x2min,x2max,x3min,x3max):
18 36.836 MiB 0.000 MiB x=integrate.nquad(cFunc,[[float(x1min),float(x1max)],[float(x2min),float(x2max)],[float(x3min),float(x3max)]])[0]
19 36.836 MiB 0.000 MiB return x
似乎没有告诉我太多。
感谢。