2

我有一个运行 [Python 1.5.2+] (http://www.roundsolutions.com/techdocs/python/Easy_Script_Python_r13.pdf) 的 Telit 模块!我可以使用的变量、模块和方法名称的数量(< 500)、每个变量的大小(16k)和 RAM 量(~ 1MB)都有一定的限制。有关详细信息,请参阅第 113 和 114 页。我想知道如何获取生成的符号数量、每个变量在 RAM 中的大小、内存使用情况(堆栈和堆使用情况)。

我需要类似于在链接过程之后使用 gcc 生成的映射文件,它向我显示每个常量/变量、符号、其地址和分配的大小。

4

2 回答 2

1

Python 是一种解释型和动态类型的语言,因此即使可能,生成这种输出也非常困难。我想获取此信息的唯一合理方法是在目标解释器上分析您的代码。

如果您正在寻找真正的内存映射,我怀疑是否存在这样的工具,因为 Python 不会经历与 C 或 C++ 相同的编译过程。由于在程序被解析和解释时,一切都是在运行时初始化和分配的,所以没有什么可以说一个解释器的行为与另一个解释器相同,尤其是在这种情况下,您运行在如此不同的架构上。因此,没有什么可以说您的对象将被创建在相同的位置,甚至具有相同的整体内存结构。

如果您只是想确定内存占用,您可以进行一些手动检查,sys.getsizeof(object, [default])前提是 Telit 的库支持它。我不认为他们使用的是 CPython 的直接实现。即使如此,这并不总是有效,并且如果您不指定参数,TypeError则无法确定对象的大小时会引发 a。default

通过研究dis模块的字节码反汇编的输出,您还可能会得到一些有趣的结果,但这假设它dis适用于您的解释器,并且您的解释器实际上是作为 VM 实现的。

如果您只需要符号列表,请查看此配方。它使用反射来转储符号列表。

良好的手动测试是这里的关键。最好的办法是设置模块的 CMUX(COM 端口 MUXing),并观察控制台输出。如果您开始耗尽内存,您会很快知道。

于 2012-09-27T18:38:54.823 回答
0

This post makes me recall my pain once with Telit GM862-GPS modules. My code was exactly at the point that the number of variables, strings, etc added up to the limit. Of course, I didn't know this fact by then. I added one innocent line and my program did not work any more. I drove me really crazy for two days until I look at the datasheet to find this fact.

What you are looking for might not have a good answer because the Python interpreter is not a full fledged version. What I did was to use the same local variable names as many as possible. Also I deleted doc strings for functions (those count too) and replace with #comments.

In the end, I want to say that this module is good for small applications. The python interpreter does not support threads or interrupts so your program must be a super loop. When your application gets bigger, each iteration will take longer. Eventually, you might want to switch to a faster platform.

于 2013-03-01T15:08:19.990 回答