Pympler asizeof与sys.getsizeof的区别

5

我有一个腌制的文件,大小为9.3MB。

-rw-r--r-- 1 ankit ankit 9.3M Jan  7 17:43 agg_397127.pkl

我使用 cPickle 在 Python 中加载它。我尝试使用 pympler 的 asizeof 来确定其大小。但是,asizeof 和 sys.getsizeof 给出的大小存在相当大的差异。

from pympler import asizeof
import cPickle as pickle
path = "agg_397127.pkl"
temp  = pickle.load(open(path, 'rb'))
temp
{397127: RandomForestRegressor(bootstrap=True, criterion='band_predict',
           max_depth=None, max_features='auto', max_leaf_nodes=None,
           min_samples_leaf=1, min_samples_split=2,
           min_weight_fraction_leaf=0.0, n_estimators=1000, n_jobs=1,
           oob_score=False, random_state=0, verbose=0, warm_start=False)}
asizeof.asizeof(temp)
1328504
asizeof.flatsize(temp)
import sys
sys.getsizeof(temp)
280

有谁能解释一下为什么会有这么大的差异吗?
1个回答

4

sys.getsizeof()返回传递给它的对象的大小——在您的例子中是一个只有一个条目的字典。它不包括由字典引用的复杂类实例的大小,也不包括该实例引用的任何对象的大小。任何只有少量条目(在我的Python版本中最多为5个)的字典都会返回完全相同的数字。

您正在使用的assizeof模块尝试递归地添加所有这些引用对象的大小。在此情况下,它似乎没有做得很好,考虑到返回的大小与pickle大小之间巨大的差异(但请注意,这些数字永远不会完全相等,因为磁盘上pickle的格式必然与内存中实际对象的格式不同)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接