好像有什么东西被卡在记忆里了

2024-09-30 01:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个程序,在一个列表上循环,然后在列表上执行一个函数。从函数返回的结果是不同的,这取决于我是否循环了多个观察值而不是一个观察值。例如,当我把第10个观察值单独放进去时,我得到一个结果,但是当我把9和10放进去,再循环一遍,我得到10的不同答案。我唯一能想到的是,在存储中有一些变量是在9上执行函数时留下的,这导致了10的一些不同。下面是循环的代码:

for i, k in enumerate(Compobs):
    print i+1, ' of ', len(Compobs)
    print Compobs[i]
    Compobs[i] = Filing(k[0],k[1])

Compobs就是这样一个列表:

[['355300', '19990531'],[...],...]

函数Filing来自我导入的另一个.py文件。它定义了一个新类Filing(),并对每个观测值执行一系列函数,最终返回一些输出。我对python还比较陌生,所以我在这里有点不知所措。我可以发布归档.py代码,但超过1000行代码。你知道吗

这是归档类和初始化。你知道吗

class Filing(object):
    cik =''
    datadate=''
    potentialpaths=[]
    potential_files=[]
    filingPath =''
    filingType=''
    reportPeriod=''
    filingText=''
    current_folder=''
    compData=pd.Series()
    potentialtablenumbers=[]
    tables=[]
    statementOfCashFlows=''
    parsedstatementOfCashFlows=[]
    denomination=''
    cashFlowDictionary ={}
    CFdataDictionary=OrderedDict()
    CFsectionindex=pd.Series()
    cfDataSeries=pd.Series()
    cfMapping=pd.DataFrame()
    compCFSeries=pd.Series()
    cftablenumber=''
    CompleteCF=pd.DataFrame()


    def __init__(self,cik,datadate):
        self.cik=cik
        self.datadate=datadate
        self.pydate=date(int(datadate[0:4]),int(datadate[4:6]),int(datadate[6:8]))
        self.findpathstofiling()
        self.selectfiling()
        self.extractFilingType()
        self.extractFilingText()
        self.getCompData()
        self.findPotentialStatementOfCashFlows()
        self.findStatementOfCashFlows()
        self.cleanUpCashFlowTable()
        self.createCashFlowDictionary()
        self.extractCFdataDictionary()
        self.createCFdataSeries()
        self.identifySections()
        self.createMapping()
        self.findOthers()

不是所有的变量归档.py每次调用时都要清除内存吗?有什么我不知道的吗?你知道吗


Tags: 函数代码pyself程序dataframe列表int
2条回答

Filing的顶层定义的所有列表、dict和其他对象只有一个副本。即使您显式地将它们分配给实例,该副本也是共享的(如果您没有显式地分配它们,则它们是继承的)。关键是,如果在一个实例中修改它们,那么在所有实例中都会修改它们。你知道吗

如果您希望每个实例都有自己的副本,那么就完全去掉顶层分配,而是在__init__中分配对象的新实例。你知道吗

换句话说,不要这样做:

class Foo(object):
    x = []

    def __init__(self):
        self.x = x

相反,请执行以下操作:

class Foo(object):
    def __init__(self):
        self.x = []

然后每个实例都有自己的x的非共享副本。你知道吗

您将类数据成员定义为类属性,而不是对象属性。它们就像C++或java类的静态数据成员。你知道吗

要解决这个问题,您不需要在__init__方法之上定义它们,而是在__init__方法中定义它们。例如

tables = []

在上面__init__你应该有:

self.tables = []

__init__

相关问题 更多 >

    热门问题