Mercurial > piecrust2
comparison piecrust/fastpickle.py @ 989:8adc27285d93
bake: Big pass on bake performance.
- Reduce the amount of data passed between processes.
- Make inter-process data simple objects to make it easier to test with
alternatives to pickle.
- Make sources have the basic requirement to be able to find a content item
from an item spec (path).
- Make Hoedown the default Markdown formatter.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sun, 19 Nov 2017 14:29:17 -0800 |
parents | 4850f8c21b6e |
children |
comparison
equal
deleted
inserted
replaced
988:f83ae0a5d793 | 989:8adc27285d93 |
---|---|
1 import io | |
1 import sys | 2 import sys |
2 import json | |
3 import codecs | 3 import codecs |
4 import datetime | 4 import datetime |
5 import collections | 5 import collections |
6 | 6 |
7 | 7 |
8 use_msgpack = False | |
9 use_marshall = False | |
10 | |
11 | |
12 if use_msgpack: | |
13 import msgpack | |
14 | |
15 def _dumps_msgpack(obj, buf): | |
16 msgpack.pack(obj, buf) | |
17 | |
18 def _loads_msgpack(buf, bufsize): | |
19 return msgpack.unpack(buf) | |
20 | |
21 _dumps = _dumps_msgpack | |
22 _loads = _loads_msgpack | |
23 | |
24 elif use_marshall: | |
25 import marshal | |
26 | |
27 def _dumps_marshal(obj, buf): | |
28 marshal.dump(obj, buf) | |
29 | |
30 def _loads_marshal(buf, bufsize): | |
31 return marshal.load(buf) | |
32 | |
33 _dumps = _dumps_marshal | |
34 _loads = _loads_marshal | |
35 | |
36 else: | |
37 import json | |
38 | |
39 class _BufferWrapper: | |
40 def __init__(self, buf): | |
41 self._buf = buf | |
42 | |
43 def write(self, data): | |
44 self._buf.write(data.encode('utf8')) | |
45 | |
46 def read(self): | |
47 return self._buf.read().decode('utf8') | |
48 | |
49 def _dumps_json(obj, buf): | |
50 buf = _BufferWrapper(buf) | |
51 json.dump(obj, buf, indent=None, separators=(',', ':')) | |
52 | |
53 def _loads_json(buf, bufsize): | |
54 buf = _BufferWrapper(buf) | |
55 return json.load(buf) | |
56 | |
57 _dumps = _dumps_json | |
58 _loads = _loads_json | |
59 | |
60 | |
8 def pickle(obj): | 61 def pickle(obj): |
9 data = _pickle_object(obj) | 62 with io.BytesIO() as buf: |
10 data = json.dumps(data, indent=None, separators=(',', ':')) | 63 pickle_intob(obj, buf) |
11 return data.encode('utf8') | 64 return buf.getvalue() |
12 | |
13 | |
14 def pickle_obj(obj): | |
15 if obj is not None: | |
16 return _pickle_object(obj) | |
17 return None | |
18 | 65 |
19 | 66 |
20 def pickle_intob(obj, buf): | 67 def pickle_intob(obj, buf): |
21 data = _pickle_object(obj) | 68 data = _pickle_object(obj) |
22 buf = _WriteWrapper(buf) | 69 _dumps(data, buf) |
23 json.dump(data, buf, indent=None, separators=(',', ':')) | |
24 | 70 |
25 | 71 |
26 def unpickle(data): | 72 def unpickle(data): |
27 data = json.loads(data.decode('utf8')) | 73 with io.BytesIO(data) as buf: |
74 data = _loads(buf, len(data)) | |
28 return _unpickle_object(data) | 75 return _unpickle_object(data) |
29 | 76 |
30 | 77 |
31 def unpickle_obj(data): | |
32 if data is not None: | |
33 return _unpickle_object(data) | |
34 return None | |
35 | |
36 | |
37 def unpickle_fromb(buf, bufsize): | 78 def unpickle_fromb(buf, bufsize): |
38 with buf.getbuffer() as innerbuf: | 79 data = _loads(buf, bufsize) |
39 data = codecs.decode(innerbuf[:bufsize], 'utf8') | |
40 data = json.loads(data) | |
41 return _unpickle_object(data) | 80 return _unpickle_object(data) |
42 | |
43 | |
44 class _WriteWrapper(object): | |
45 def __init__(self, buf): | |
46 self._buf = buf | |
47 | |
48 def write(self, data): | |
49 self._buf.write(data.encode('utf8')) | |
50 | 81 |
51 | 82 |
52 _PICKLING = 0 | 83 _PICKLING = 0 |
53 _UNPICKLING = 1 | 84 _UNPICKLING = 1 |
54 | 85 |