Python 迭代器对象、对象和内存性能

Python 迭代器对象、对象和内存性能,python,memory-leaks,pyqt,python-2.7,Python,Memory Leaks,Pyqt,Python 2.7,我正在开发一个PyQt4应用程序,我几乎已经完成了,只是有一个内存泄漏。整个程序的代码相当长,所以我不会在这里全部发布。我一直在使用一个名为Python内存验证器的工具来跟踪我的应用程序的内存分配。我注意到,在程序初始化之后,实例数量继续增加的类,最显著的是迭代器,特别是字典键迭代器,列表迭代器,和tupleiterator。除此之外,实例数量继续增加的唯一其他类是PyCapsule和methodwrapper 我已经调查了迭代器的分配位置,每次使用zip()函数时,似乎至少会实例化tuplei

我正在开发一个PyQt4应用程序,我几乎已经完成了,只是有一个内存泄漏。整个程序的代码相当长,所以我不会在这里全部发布。我一直在使用一个名为Python内存验证器的工具来跟踪我的应用程序的内存分配。我注意到,在程序初始化之后,实例数量继续增加的类,最显著的是迭代器,特别是
字典键迭代器
列表迭代器
,和
tupleiterator
。除此之外,实例数量继续增加的唯一其他类是
PyCapsule
methodwrapper

我已经调查了迭代器的分配位置,每次使用
zip()
函数时,似乎至少会实例化tupleiterator,并且从未删除过。这是正常行为还是这些迭代器可能是内存泄漏的原因?如果是,是否有解决办法

我还研究了PyCapsules和方法包装器的实例化位置,它们似乎都是从具有以下代码的方法创建的,并且从未被删除

def importXml(self, fh):
    error = None
    try:
        handler = SaxSensorDataHandler(self)
        parser = QXmlSimpleReader()
        parser.setContentHandler(handler)
        parser.setErrorHandler(handler)
        input_ = QXmlInputSource(fh)
        self.new = True
        if not parser.parse(input_):
            if handler.errorLine == 4:
                self.new = False
            else:
                raise ValueError
    except (IOError, OSError, ValueError), e:
        error = "Failed to import file: %s" % e
    finally:
        if fh is not None:
            fh.close()
        if error is not None:
            return False, error
        if len(self.__sensors) == 0:
            return False, "Discovered no sensors connected to %s. Please check sensor connections and try again." % fh.url().host()
        self.__dirty = True
        return True, 'Discovered %d sensors connected to %s. Please press "Start" to begin taking measurements.' %(len(self.__sensors), fh.url().host())
这主要包括实例化和使用stock PyQt类,其中
SaxSensorDataHandler
是重新实现的
qxmldaulthandler
,唯一重新实现的方法是XML处理程序在读取XML标记时调用的方法。我对这些方法所做的就是将检索到的信息分配给变量,并调用另一个方法来更新容器中相应的变量,所以这不应该导致内存泄漏。那么,内存泄漏可能是由PyQt4的Xml处理程序类的任何已知问题引起的吗

提前感谢您的帮助

尝试使用。要调试泄漏的程序,请调用
gc.set\u debug(gc.debug\u LEAK)
,您将在
sys.stderr
上获得调试输出