Skip to content

Instantly share code, notes, and snippets.

@veloutin
Last active December 31, 2015 04:28
Show Gist options
  • Save veloutin/7934090 to your computer and use it in GitHub Desktop.
Save veloutin/7934090 to your computer and use it in GitHub Desktop.
Attempt to rewrite bytecode to preallocate dicts
from types import FunctionType, CodeType
import opcode
import struct
import sys
_BUILDMAP = opcode.opmap['BUILD_MAP']
if sys.version_info.major > 2:
from io import BytesIO
exop = int
def make_code(co, codestr):
return CodeType(co.co_argcount, co.co_kwonlyargcount, co.co_nlocals,
co.co_stacksize, co.co_flags, codestr, co.co_consts,
co.co_names, co.co_varnames, co.co_filename,
co.co_name, co.co_firstlineno, co.co_lnotab,
co.co_freevars, co.co_cellvars)
else:
from cStringIO import StringIO as BytesIO
exop = ord
def make_code(co, codestr):
return CodeType(co.co_argcount, co.co_nlocals, co.co_stacksize,
co.co_flags, codestr, co.co_consts, co.co_names,
co.co_varnames, co.co_filename, co.co_name,
co.co_firstlineno, co.co_lnotab, co.co_freevars,
co.co_cellvars)
def hint_map_sizes(size):
def decorate(func):
code = func.__code__
newcode = BytesIO()
citer = iter(code.co_code)
for c in citer:
newcode.write(c)
c = exop(c)
if c >= opcode.HAVE_ARGUMENT:
arg = next(citer) + next(citer)
if c == _BUILDMAP:
arg = struct.pack("<H", size)
newcode.write(arg)
newcode = make_code(code, newcode.getvalue())
return FunctionType(newcode, func.__globals__, func.__name__,
func.__defaults__, func.__closure__)
return decorate
def foo(n):
res = {}
for i in range(n):
res[i] = i
return res
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment