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): # en 32 bits t = type(o) s = t == str and 25 + len(o) # 49 en 64 bits if t == int: s = 12 # 24 en 64 bits while o: s += 2 # 4 en 64 bits o >>= 15 # 30 en 64 bits elif t == list: s = 28 + 4*len(o) # 56 + 8 en 64 bits 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)))