Welcome, guest | Sign In | My Account | Store | Cart
from pickletools import genops

def optimize(p):
   
'Optimize a pickle string by removing unused PUT opcodes'
    gets
= set()            # set of args used by a GET opcode
    puts
= []               # (arg, startpos, stoppos) for the PUT opcodes
    prevpos
= None          # set to pos if previous opcode was a PUT
   
for opcode, arg, pos in genops(p):
       
if prevpos is not None:
            puts
.append((prevarg, prevpos, pos))
            prevpos
= None
       
if 'PUT' in opcode.name:
            prevarg
, prevpos = arg, pos
       
elif 'GET' in opcode.name:
            gets
.add(arg)

   
# Copy the pickle string except for PUTS without a corresponding GET
    s
= []
    i
= 0
   
for arg, start, stop in puts:
        j
= stop if (arg in gets) else start
        s
.append(p[i:j])
        i
= stop
    s
.append(p[i:])            
   
return ''.join(s)


if __name__ == '__main__':
   
from pickle import dumps
   
from pickletools import dis

    p
= dumps(['the', 'quick', 'brown', 'fox'])
   
print 'Before:'
    dis
(p)
   
print '\nAfter:'
    dis
(optimize(p))

History

  • revision 2 (16 years ago)
  • previous revisions are not available