diff options
| author | Bob Ippolito <bob@redivi.com> | 2008-09-26 08:00:20 +0000 |
|---|---|---|
| committer | Bob Ippolito <bob@redivi.com> | 2008-09-26 08:00:20 +0000 |
| commit | 516cb02410e0bf2d539e52a9d8a3db34cc934b68 (patch) | |
| tree | dafb728ed45d3ad5781932dc6bddde690339b38e /simplejson/encoder.py | |
| parent | f9118892a3f51d673a97bf94f1d33fd75d17dffd (diff) | |
| download | simplejson-516cb02410e0bf2d539e52a9d8a3db34cc934b68.tar.gz | |
C fast path for encoding
git-svn-id: http://simplejson.googlecode.com/svn/trunk@121 a4795897-2c25-0410-b006-0d3caba88fa1
Diffstat (limited to 'simplejson/encoder.py')
| -rw-r--r-- | simplejson/encoder.py | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/simplejson/encoder.py b/simplejson/encoder.py index 4af4fd7..9922c80 100644 --- a/simplejson/encoder.py +++ b/simplejson/encoder.py @@ -7,6 +7,10 @@ try: from simplejson._speedups import encode_basestring_ascii as c_encode_basestring_ascii except ImportError: c_encode_basestring_ascii = None +try: + from simplejson._speedups import make_encoder as c_make_encoder +except ImportError: + c_make_encoder = None ESCAPE = re.compile(r'[\x00-\x1f\\"\b\f\n\r\t]') ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])') @@ -189,10 +193,12 @@ class JSONEncoder(object): # This doesn't pass the iterator directly to ''.join() because the # exceptions aren't as detailed. The list call should be roughly # equivalent to the PySequence_Fast that ''.join() would do. - chunks = list(self.iterencode(o)) + chunks = self.iterencode(o, _one_shot=True) + if not isinstance(chunks, (list, tuple)): + chunks = list(chunks) return ''.join(chunks) - def iterencode(self, o): + def iterencode(self, o, _one_shot=False): """ Encode the given object and yield each string representation as available. @@ -236,20 +242,26 @@ class JSONEncoder(object): return text - _iterencode = _make_iterencode( - markers, self.default, _encoder, self.indent, floatstr, - self.key_separator, self.item_separator, self.sort_keys, self.skipkeys) + if _one_shot and c_make_encoder is not None and not self.indent and not self.sort_keys: + c_encoder = c_make_encoder( + markers, self.default, _encoder, self.indent, floatstr, + self.key_separator, self.item_separator, self.sort_keys, + self.skipkeys) + _iterencode = c_encoder._iterencode + else: + _iterencode = _make_iterencode( + markers, self.default, _encoder, self.indent, floatstr, + self.key_separator, self.item_separator, self.sort_keys, + self.skipkeys, _one_shot) return _iterencode(o, 0) -def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys, +def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separator, _item_separator, _sort_keys, _skipkeys, _one_shot, ## HACK: hand-optimized bytecode; turn globals into locals False=False, True=True, ValueError=ValueError, basestring=basestring, dict=dict, - encode_basestring_ascii=encode_basestring_ascii, - encode_basestring=encode_basestring, float=float, id=id, int=int, @@ -260,7 +272,6 @@ def _make_iterencode(markers, _default, _encoder, _indent, _floatstr, _key_separ tuple=tuple, ): - def _iterencode_list(lst, _current_indent_level): if not lst: yield '[]' |
