Optimize a pickle string by removing unused PUT opcodes
(p)
| 1 | from pickletools import genops |
| 2 | |
| 3 | def optimize(p): |
| 4 | 'Optimize a pickle string by removing unused PUT opcodes' |
| 5 | gets = set() # set of args used by a GET opcode |
| 6 | puts = [] # (arg, startpos, stoppos) for the PUT opcodes |
| 7 | prevpos = None # set to pos if previous opcode was a PUT |
| 8 | for opcode, arg, pos in genops(p): |
| 9 | if prevpos is not None: |
| 10 | puts.append((prevarg, prevpos, pos)) |
| 11 | prevpos = None |
| 12 | if 'PUT' in opcode.name: |
| 13 | prevarg, prevpos = arg, pos |
| 14 | elif 'GET' in opcode.name: |
| 15 | gets.add(arg) |
| 16 | |
| 17 | # Copy the pickle string except for PUTS without a corresponding GET |
| 18 | s = [] |
| 19 | i = 0 |
| 20 | for arg, start, stop in puts: |
| 21 | j = stop if (arg in gets) else start |
| 22 | s.append(p[i:j]) |
| 23 | i = stop |
| 24 | s.append(p[i:]) |
| 25 | return ''.join(s) |
| 26 | |
| 27 | |
| 28 | if __name__ == '__main__': |
no test coverage detected