gpt4 book ai didi

Python内存问题

转载 作者:太空宇宙 更新时间:2023-11-03 19:34:45 24 4
gpt4 key购买 nike

我开始用 python 编程,但我有内存问题(抱歉我的英语不好)。我在我的算法上做了一个 while 循环,但是在每个循环中,程序都会消耗大量内存。我有 3Gb RAM、AMD 64 x2 处理器和 Windows 7 64 位。

对于每个 cicle,它消耗大约 800 Mb 的 RAM,我认为这太多了。我的部分代码在这里

from sympy import Symbol, diff, flatten 
import numpy as np
from numpy import linalg
from math import log, sqrt, cos, pi
import matplotlib.pyplot as plt

L = 7 #numero de variables
X = [Symbol('x%d' % i) for i in range(L*(L+1))] #Las variables simbolicas
XX = [X[i] for i in xrange(L)]

LAM = []

# Parametros
Pr = 10
Eps = 0
Ome = 5
LL = 0.5
b = 2
Gam = 0.2*2*(pi**2)


ran1 = xrange(L)
ran2 = xrange(L*L)
ran3 = xrange(0,L*(L-1)+1,L)
ran4 = xrange(L,2*L,1)

dt = 0.01
TMAX = 60

def f(x,R,Tau):
return [Pr*((1 + Eps*cos(Ome*Tau))*x[2] - LL*x[0] - (1 -LL*x[5])) , \
Pr*((1 + Eps*cos(Ome*Tau))*x[3] - LL*x[1] - (1 - LL)*x[6]),\
R*x[0] - x[2] - x[0]*x[4],R*x[1] - x[3] - x[1]*x[4],(x[0]*x[2] + x[1]*x[3])/2 - b*x[4],\
(1/Gam)*(x[0] - x[5]),(1/Gam)*(x[1] - x[6])]

def Jacobian(f,x): #num son los numeros en el que se evalua la matriz jacobiana, x las variables y f la funcion
return [[diff(f[i],x[n]) for i in ran1] for n in ran1]

def Y(x):
return[[x[i+j] for j in ran3] for i in ran4]
#Ahora la multiplicacion de Y traspuesto por Jacobian traspuesto
def JY(r,Tau):
J = flatten((np.dot(np.array(Jacobian(f(XX,r,Tau),XX)),np.array(Y(X)))).T)
return [J[i] for i in ran2]
def Func(x,r,Tau): #Expandemos las funciones en un solo arreglo
FFF = []
map(lambda g: FFF.append(g),f(XX,r,Tau))
map(lambda g: FFF.append(g),JY(r,Tau))
return map(lambda f: f.evalf(subs={X[j]:x[j] for j in xrange(L*(L+1))}),FFF)

def RKutta(xi,r):
i = 1
while i <= int(TMAX/dt):
Tau = 0
YY = xi
k1 = np.array(Func(YY,r,Tau))*dt
k2 = (np.array(Func(YY + k1/2,r,Tau/2)))*dt
k3 = (np.array(Func(YY + k2/2,r,Tau/2)))*dt
k4 = (np.array(Func(YY + k3,r,Tau)))*dt
xi = YY + (k1/6) + (k2/3) + (k3/3) + (k4/6)
Tau = Tau + dt
i = i + 1
return [xi[j] for j in xrange(len(xi))]


def lyap(xxi):
u = [i for i in flatten(np.random.rand(1,L))]
PhiT = (np.array([[float(xxi[i+j]) for j in ran3] for i in ran4])).T
PU = np.dot(PhiT,u)
summ = 0
jj = 0
while jj < len(PU):
summ += (float(PU[jj]))**2
jj = jj + 1
lam = log(sqrt(summ))/TMAX
return lam

R = 46.5
Rmax = 48.5
Rstep = 0.5

while R <= Rmax:
xi = [5,5,5,5,5,5,5] #Condiciones Iniciales
for i in ran2:
xi.append(None)

for i in ran4:
for j in ran3:
if (i+j+1)%(L+1) == 0:
xi[i+j] = 1
else:
xi[i+j] = 0

#Ahora el Runge Kutta para integrar todo el sistema


#Y.append([r for r in xx])
# savetxt('butterfly.txt', Y, fmt="%12.6G")
#print Y
XI = RKutta(xi,R)
lamb = lyap(XI)
LAM.append([R,lamb])
print [R,lamb]
R = R + Rstep
#print LAM
#x = [LAM[i][0] for i in xrange(len(LAM))]
#y = [LAM[i][1] for i in xrange(len(LAM))]
np.savetxt('lyap3.txt', LAM, fmt="%12.6G")
#plt.axis([10,30,-3,3]);
#plt.scatter(x,y)
#plt.show()

不知道问题出在哪里。也许是龙格库塔台阶或架构问题。内存似乎并没有在每一步都被清理,而且我没有存储任何东西,只是在代码末尾存储一对数字。我希望我能很好地表达自己。

#

好的,我编辑了这个并发布了整个代码,我希望有人可以提供帮助:)。我改变了很多东西,但我仍然有内存问题。每个 cicle 使用大约 600 Mb RAM。

#

提前致谢

最佳答案

在没有上下文的情况下遵循代码有点棘手,因为您显然在多个地方使用了 numpy (既作为 np 又不带前缀),而 evalf 可能来自 sympy.. 但我们没有看到您的导入.

根据非常模糊的猜测,您的某些列表推导式构建的临时列表的保留时间比预期的要长。你也许可以将它们转换成发电机。另一种技术是尽可能使用 map() 或类似技术。

我还注意到一些不需要的非Pythonic索引迭代。 Func 首先构建一个名为 FFF 的列表,一次一个项目(相当昂贵),然后无缘由地按索引迭代它。使用 [f(item) for item in seq] 而不是 [f(seq[i]) for i in xrange(len(seq))],或者更好,map(f, seq),在这种情况下,尝试根本不构建临时列表。

关于Python内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4110423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com