pympler引发TypeError

时间:2016-06-03 11:57:31

标签: python python-2.7 memory-management memory-leaks

在python2.7中,遵循pympler example

from anotherfile import somefunction, somecustomclass
from os import path, listdir
import pandas as pd
import gc
from pympler import tracker, muppy, summary

all_objects = muppy.get_objects()
print 'all objects: ', len(all_objects)
sum1 = summary.summarize(all_objects)
summary.print_(sum1)

这是导入后的第一个代码。它导致

/usr/bin/python2.7 /myprog.py
all objects:  98755
Traceback (most recent call last):
File "/myprog.py", line 12, in <module>
sum1 = summary.summarize(all_objects)
File "/usr/local/lib/python2.7/dist-packages/pympler/summary.py", line 131, in summarize
total_size[otype] = _getsizeof(o)
File "/usr/local/lib/python2.7/dist-packages/pandas/core/base.py", line 130, in __sizeof__
return super(self, PandasObject).__sizeof__()
TypeError: super() argument 1 must be type, not FrozenList

Process finished with exit code 1

当我尝试初始化SummaryTracker对象时,我得到了同样的错误。

它看起来像是Pympler中的一个错误,但是我找不到它的任何提及都与此相矛盾。根据官方documentation,“Pympler完全用Python编写,没有外部库的依赖。它已经在Linux,Windows和MacOS上用Python 2.5,2.6,2.7,3.1,3.2,3.3,3.4进行了测试X。”实际上,在新的python文件中只使用python 2.7运行以下代码不会产生任何错误并按预期工作:

from pympler import muppy, tracker

tr = tracker.SummaryTracker()
tr.print_diff()

那么我错过了什么?

3 个答案:

答案 0 :(得分:2)

它似乎是熊猫图书馆的一个问题。我通过编辑库代码解决了它。错误的跟踪表明您哪一行错误:

File "/usr/local/lib/python2.7/dist-packages/pandas/core/base.py", line 130, in __sizeof__ 
return super(self, PandasObject).__sizeof__()

您只需更改参数的顺序,如下所示:

return super(PandasObject, self).__sizeof__()

我做到了,我能够正常运行我的程序。

答案 1 :(得分:1)

这是Pandas issue #12924PandasObject.__sizeof__调用了super调用错误顺序的参数。该修复已被撤消,它应该在下一个版本中可用。在此期间,您可以编辑pandas/core/base.py以切换参数顺序,或者您可以测试错误的存在并使用更正的版本对该方法进行猴子修补。

答案 2 :(得分:0)

该代码可能只适用于Python3。在this question中,python2存在相同的错误,如果您查看接受的响应,则说:

  在python3中引入了

super()(不带参数):

     

super() - &gt;与超级(,)

相同      

所以这将是新式类的python2等价物:

     

super(CurrentClass,self)

如果你不想改变库代码,你可能不得不使用python3。