计算Python脚本中的符号数

时间:2012-09-27 17:59:02

标签: python symbols decompiling

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

如果您只想要一个符号列表,请查看this recipe。它使用反射来转储符号列表。

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

答案 1 :(得分:0)

这篇文章让我想起了Telit GM862-GPS模块一次的痛苦。我的代码恰好是变量,字符串等的数量加起来的极限。当然,到那时我还不知道这个事实。我添加了一条无辜的线,我的程序不再起作用了。我开车两天真的很疯狂,直到我看数据表找到这个事实。

您正在寻找的内容可能没有一个好的答案,因为Python解释器不是一个完整的版本。我所做的是尽可能多地使用相同的局部变量名。我还删除了函数的doc字符串(那些也计算在内)并用#comments替换。

最后,我想说这个模块适用于小型应用程序。 python解释器不支持线程或中断,因此您的程序必须是超级循环。当您的应用程序变大时,每次迭代都需要更长时间。最终,您可能希望切换到更快的平台。