import sys import resource # on my settings, these settings cause segmentation fault in ~30 seconds. # note that I set SCALE_EXPRESSION_BY to 10,000 as well resource.setrlimit(resource.RLIMIT_DATA, (92233720368, 92233720368)) resource.setrlimit(resource.RLIMIT_STACK, (8372, 67090)) # multiply the large expression in the 'nastiness' string by this factor # floating point numbers are supported SCALE_EXPRESSION_BY = 10000 class ExecMethods: COMPILE_ONLY = 0 COMPILE_THEN_EXEC = 1 ONE_STEP_EXEC = 2 USE_EXECMETHOD = ExecMethods.COMPILE_THEN_EXEC # --- do not change. --- # when this magic number is 50 and the constant above is 1, you get the # original example posted by @mjo SCALING_CONSTANT = 88 # ------ def do_compile(): """Return a booean indicating success""" try: if USE_EXECMETHOD == ExecMethods.COMPILE_ONLY: compile(nastiness, '', 'exec') elif USE_EXECMETHOD == ExecMethods.COMPILE_THEN_EXEC: co = compile(nastiness, '', 'exec') exec(co) elif USE_EXECMETHOD == ExecMethods.ONE_STEP_EXEC: exec(nastiness) return True except RecursionError: return False def grow_to_success(): """At the bottom, this runs for python3""" limit = sys.getrecursionlimit() while not do_compile(): print('limit: {}'.format(limit)) limit = int(limit * 1.3) sys.setrecursionlimit(limit) return limit def shrink_to_failure(): """At the bottom, this runs for python2""" limit = sys.getrecursionlimit() while do_compile(): print('limit: {}'.format(limit)) limit = int(limit * 0.5) sys.setrecursionlimit(limit) return limit nastiness = ("""d2u1 = 1 d2u1u2 = 2 d2u1u3 = 3 d2u2 = 5 d2u2u3 = 7 d2u3 = 11 du1 = 13 du2 = 17 du3 = 19 u1 = 23 u2 = 29 u3 = 31 DPT = """ + ("""1/2*(u1^12*u2^5*d2u1 + 6*u1^11*u2^6*d2u1 + 16*u1^10*u2^7*d2u1 + """ + ("""25*u1^9*u2^8*d2u1 + 25*u1^8*u2^9*d2u1 + 16*u1^7*u2^10*d2u1 + 6*u1^6*u2^11*d2u1 + u1^5*u2^12*d2u1 + 5*u1^12*u2^4*u3*d2u1 + 36*u1^11*u2^5*u3*d2u1 + 116*u1^10*u2^6*u3*d2u1 + 220*u1^9*u2^7*u3*d2u1 + 270*u1^8*u2^8*u3*d2u1 + 220*u1^7*u2^9*u3*d2u1 + 116*u1^6*u2^10*u3*d2u1 + 36*u1^5*u2^11*u3*d2u1 + 5*u1^4*u2^12*u3*d2u1 + 10*u1^12*u2^3*u3^2*d2u1 + 90*u1^11*u2^4*u3^2*d2u1 + """ * int(SCALE_EXPRESSION_BY * SCALING_CONSTANT)) + """356*u1^10*u2^5*u3^2*d2u1)""")) if __name__ == '__main__': if sys.version_info[0] == 3: grow_to_success() else: shrink_to_failure()