“有一个字典,每一条指令都有一个词条是可能的,但也是非常浪费的。”你认为用这种语言编写的程序会有数百万条指令的长度吗?如果没有,这正是我推荐的。不要过早地优化。大多数人将这句格言理解为绩效,但它也适用于资源使用。在
如果您确实需要优化空间,假设您使用的是python2.6或更高版本,我建议使用bytearray。顾名思义,它是一个字节数组,因此可以表示0-255的值。数组中的每一项都表示对应行上的语句数。要将指令号转换回行号,请执行以下操作:instcounts = bytearray((2, 4, 6, 3, 1, 1, 5, 2, 3))
def getline(instnumber):
count = line = 0
while count <= instnumber and line < len(instcounts):
count += instcounts[line]
line += 1
return line # conveniently, this will be 1-indexed :-)
getline(15) # tells me instruction 15 is on line 5
与torek的回答相比,这种方法的优势在于,它在每行源代码中只存储一个字节的基本相同的信息:比列表更高效。您需要做一些额外的工作来计算行号,但实际上,即使在非常大的文件上,您也不会注意到,而且您只会在打印错误消息时运行它,这几乎不是一个速度关键函数。上面的函数在代表1000000行的bytearray上需要大约十分之一秒的时间,这是在运行了4年的macpro的windowsxp虚拟机上python3.1下未优化的代码。在
需要内存吗?1087199字节,大约是torek解决方案中list所需的四分之一,不包括列表中引用的int对象,每个都是14个字节(CPython重用一个小整数对象池,因此如果要为整数使用额外的内存,那么小文件可能不会占用太多内存)。在
顺便说一句,CPython使用了一个非常相似的方案(参见任何函数的func_code.co_lnotab或{})。在