gpt4 book ai didi

python - 如何将 memory_profiler(python 模块)与类方法一起使用?

转载 作者:太空狗 更新时间:2023-10-30 00:03:20 26 4
gpt4 key购买 nike

我想分析类方法的时间和内存使用情况。我没有为此找到开箱即用的解决方案(有这样的模块吗?),我决定使用 timeit 进行时间分析,并使用 memory_profiler 中的 memory_usage 模块。

我遇到了使用 memory_profiler 分析方法的问题。我尝试了不同的变体,但没有一个起作用。

当我尝试使用 functools 中的 partial 时,出现此错误:

File "/usr/lib/python2.7/site-packages/memory_profiler.py", line 126, in memory_usage
aspec = inspect.getargspec(f)
File "/usr/lib64/python2.7/inspect.py", line 815, in getargspec
raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <functools.partial object at 0x252da48> is not a Python function

顺便说一句,完全相同的方法适用于 timeit 函数。

当我尝试按原样使用 lambda 时出现此错误:

File "/usr/lib/python2.7/site-packages/memory_profiler.py", line 141, in memory_usage
ret = parent_conn.recv()
IOError: [Errno 4] Interrupted system call

如何使用 memory_profiler 处理类方法?

PS:我有 memory-profiler (0.26)(用 pip 安装)。

UPD:这实际上是一个错误。您可以在此处查看状态:https://github.com/pythonprofilers/memory_profiler/issues/47

最佳答案

如果要查看分配给 Python VM 的内存变化,可以使用 psutil .这是一个使用 psuil 的简单装饰器,它将打印内存中的变化:

import functools
import os
import psutil


def print_memory(fn):
def wrapper(*args, **kwargs):
process = psutil.Process(os.getpid())
start_rss, start_vms = process.get_memory_info()
try:
return fn(*args, **kwargs)
finally:
end_rss, end_vms = process.get_memory_info()
print((end_rss - start_rss), (end_vms - start_vms))
return wrapper


@print_memory
def f():
s = 'a'*100

很可能,您将看到的输出表明内存没有变化。这是因为对于小的分配,Python VM 可能不需要从操作系统请求更多内存。如果你分配一个大数组,你会看到一些不同的东西:

import numpy
@print_memory
def f():
return numpy.zeros((512,512))

在这里你应该看到内存有一些变化。

如果您想查看每个分配的对象使用了多少内存,我知道的唯一工具是 heapy

In [1]: from guppy import hpy; hp=hpy()

In [2]: h = hp.heap()

In [3]: h
Out[3]:
Partition of a set of 120931 objects. Total size = 17595552 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 57849 48 6355504 36 6355504 36 str
1 29117 24 2535608 14 8891112 51 tuple
2 394 0 1299952 7 10191064 58 dict of module
3 1476 1 1288416 7 11479480 65 dict (no owner)
4 7683 6 983424 6 12462904 71 types.CodeType
5 7560 6 907200 5 13370104 76 function
6 858 1 770464 4 14140568 80 type
7 858 1 756336 4 14896904 85 dict of type
8 272 0 293504 2 15190408 86 dict of class
9 304 0 215064 1 15405472 88 unicode
<501 more rows. Type e.g. '_.more' to view.>

我已经很长时间没有使用它了,所以我建议尝试并阅读文档。请注意,对于使用大量内存的应用程序,计算此信息可能会非常慢。

关于python - 如何将 memory_profiler(python 模块)与类方法一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16593246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com