Tests and returns the maximum usable heap. By trying to allocate as many long strings as possible. More reliable if run directly after Python initialisation, or after running gc.collect() when available. Use : mem()
def size(o): t = type(o) s = t == str and 49 + len(o) if t == int: s = 24 while o: s += 4 o >>= 30 elif t == list: s = 64 + 8*len(o) for so in o: s += size(so) return s def mem(v=1): try: l=[] try: l.append(0) l.append(0) l.append("") l[2] += "x" l.append(0) l.append(0) while 1: try: l[2] += l[2][l[1]:] except: if l[1] < len(l[2]) - 1: l[1] = len(l[2]) - 1 else: raise(Exception) except: if v: print("+", size(l)) try: l[0] += size(l) except: pass try: l[3], l[4] = mem(v) except: pass return l[0] + l[3], max(l[0], l[4]) except: return 0, 0 def testmem(): m1, m2 = 0, 0 while 1: t1, t2 = mem(0) if t1 > m1 or t2 > m2: m1 = max(t1, m1) m2 = max(t2, m2) input(str((m1,m2)))