我正在使用 Pympler 进行一些合理性检查,以确保在尝试分析实际脚本时我理解结果,但我对结果有点困惑。以下是我尝试过的完整性检查:
完整性检查 1:我启动 Python (3) 控制台并执行以下操作:
from pympler import summary, muppy
sum = summary.summarize(muppy.get_objects())
summary.print_(sum)
这导致以下摘要:
types | # objects | total size
==================================== | =========== | ============
<class 'str | 16047 | 1.71 MB
<class 'dict | 2074 | 1.59 MB
<class 'type | 678 | 678.27 KB
<class 'code | 4789 | 673.68 KB
<class 'set | 464 | 211.00 KB
<class 'list | 1319 | 147.16 KB
<class 'tuple | 1810 | 120.03 KB
<class 'weakref | 1269 | 99.14 KB
<class 'wrapper_descriptor | 1124 | 87.81 KB
<class 'builtin_function_or_method | 918 | 64.55 KB
<class 'abc.ABCMeta | 64 | 62.25 KB
<class 'method_descriptor | 877 | 61.66 KB
<class 'int | 1958 | 58.88 KB
<class 'getset_descriptor | 696 | 48.94 KB
function (__init__) | 306 | 40.64 KB
如果我刚刚启动了一个新的 Python session ,内存中怎么会有所有这些字符串、字典、列表等?我不认为 Pympler 会总结所有 session 的结果(这没有任何意义,但这是我能想到的唯一可能性)。
SANITY CHECK 2:由于我不太了解 tabula rasa Python session 的汇总结果,所以让我们在定义了一些变量/数据结构之后看看汇总的差异。我启动另一个控制台并执行以下操作:
from pympler import summary, muppy
sum = summary.summarize(muppy.get_objects())
a = {}
b = {}
c = {}
d = {'a': [0, 0, 1, 2], 't': [3, 3, 3, 1]}
sum1 = summary.summarize(muppy.get_objects())
summary.print_(summary.get_diff(sum, sum1))
这导致以下摘要:
types | # objects | total size
============================== | =========== | ============
<class 'list | 3247 | 305.05 KB
<class 'str | 3234 | 226.04 KB
<class 'int | 552 | 15.09 KB
<class 'dict | 1 | 480 B
function (_keys) | 0 | 0 B
function (get_path) | 0 | 0 B
function (http_open) | 0 | 0 B
function (memoize) | 0 | 0 B
function (see) | 0 | 0 B
function (recvfrom) | 0 | 0 B
function (rfind) | 0 | 0 B
function (wm_focusmodel) | 0 | 0 B
function (_parse_makefile) | 0 | 0 B
function (_decode_pax_field) | 0 | 0 B
function (__gt__) | 0 | 0 B
我以为我刚刚初始化了四个新词典(尽管有 3 个是空的),那么为什么 Muppy 只显示 1 个新词典对象的差异?此外,为什么有成千上万的新字符串和列表,更不用说整数了?
健全性检查 3:我又开始了一个新的 Python session ,但这次我想看看 Pympler 如何处理更复杂的数据类型,比如字典列表。
from pympler import muppy, summary
sum = summary.summarize(muppy.get_objects())
a = [{}, {}, {}, {'a': [0, 0, 1, 2], 't': [3, 3, 3, 1]}, {'a': [1, 2, 3, 4]}]
sum1 = summary.summarize(muppy.get_objects())
summary.print_(summary.get_diff(sum, sum1))
结果如下:
types | # objects | total size
===================================================== | =========== | ============
<class 'list | 3233 | 303.88 KB
<class 'str | 3270 | 230.71 KB
<class 'int | 554 | 15.16 KB
<class 'dict | 10 | 5.53 KB
<class 'code | 16 | 2.25 KB
<class 'type | 2 | 1.98 KB
<class 'tuple | 6 | 512 B
<class 'getset_descriptor | 4 | 288 B
function (__init__) | 2 | 272 B
<class '_frozen_importlib_external.SourceFileLoader | 3 | 168 B
<class '_frozen_importlib.ModuleSpec | 3 | 168 B
<class 'weakref | 2 | 160 B
function (__call__) | 1 | 136 B
function (Find) | 1 | 136 B
function (<lambda>) | 1 | 136 B
尽管列表和词典的嵌套有点复杂,但据我统计,我添加了 5 个新词典和 4 个新列表。
谁能解释一下 Muppy 是如何计算物体数量的?
最佳答案
get_objects 在一个新的 Python session 中summary.summarize(muppy.get_objects()) 返回启动期间实例化的任何对象,而 from pympler import summary, muppy 运行,这解释了大计数。
get_objects调用的区别请记住,summary.summarize() 生成的 sum 对象是在第一个快照之后创建的,这解释了“数以千计的新字符串和列表”。您可以通过将测试重写为以下方式来解决此问题:
from pympler import summary, muppy
o1 = muppy.get_objects()
a = {}
b = {}
c = {}
d = {'a': [0, 0, 1, 2], 't': [3, 3, 3, 1]}
o2 = muppy.get_objects()
summary.print_(summary.get_diff(summary.summarize(o1), summary.summarize(o2)))
这将减少 o1 和其他几个对象的大列表的无关差异:
>>> for o in diff['+']:
... print("%s - %s" % (type(o), o if len(o) < 10 else "long list"))
...
<class 'str'> - o2
<class 'list'> - long list
<class 'dict'> - {'a': [0, 0, 1, 2], 't': [3, 3, 3, 1]}
<class 'list'> - ['o2', 'muppy', 'get_objects']
<class 'list'> - [0, 0, 1, 2]
<class 'list'> - [3, 3, 3, 1]
要理解这一点,我们需要知道 pympler 到底在检查什么。
muppy.get_objects 实现 relies在
gc.get_objects(),它是“收集器跟踪的所有对象的列表”(gc.is_tracked),堆栈帧除外。
instances of atomic types aren’t tracked and instances of non-atomic types (containers, user-defined objects…) are. However, some type-specific optimizations can be present in order to suppress the garbage collector footprint of simple instances (e.g. dicts containing only atomic keys and values)
__flags__ 中。 (这似乎是一个错误,因为排除所有容器对象会遗漏容器类型的“简单实例”,这些容器类型不受 GC 跟踪。更新 Should be fixed 在 v0.8 中发布,2019-11- 12)如果您按照上面的建议存储对象列表 o2 并检查使用了哪些对象:
def tracked(obj_list, obj):
import gc
return {"tracked_by_muppy": any(id(item) == id(obj) for item in obj_list),
"gc_tracked": gc.is_tracked(obj)}
你会看到:
空字典不会被 GC 跟踪,因为它们仅从局部变量引用,所以它们不会被 muppy 解释:
tracked(o2, a) # => {'tracked_by_muppy': False, 'gc_tracked': False}
非平凡的字典 d 是 GC 跟踪的,因此出现在 muppy 报告中:
tracked(o2, d) # => {'tracked_by_muppy': True, 'gc_tracked': True}
关于python - Pympler 总结似乎没有意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36609625/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow
我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht