From c7f78a08e554d1a6ba6a0843af43805359f8004d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl> Date: Wed, 26 May 2021 22:36:51 +0200 Subject: [PATCH] speed improvements --- CHANGELOG.md | 1 + minijson.pyx | 13 ++++--------- setup.cfg | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cfecec..f641f24 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,3 +5,4 @@ here's only the changelog for the version in development * proofed against loading empty strings * Python 3.6 is supported +* minor speed improvements diff --git a/minijson.pyx b/minijson.pyx index 63a1586..8eedfe8 100644 --- a/minijson.pyx +++ b/minijson.pyx @@ -44,13 +44,13 @@ cpdef void switch_default_double(): global float_encoding_mode float_encoding_mode = 1 -cdef tuple parse_cstring(bytes data, int starting_position): +cdef inline tuple parse_cstring(bytes data, int starting_position): cdef: int strlen = data[starting_position] bytes subdata = data[starting_position+1:starting_position+1+strlen] return strlen+1, subdata -cdef tuple parse_list(bytes data, int elem_count, int starting_position): +cdef inline tuple parse_list(bytes data, int elem_count, int starting_position): """ Parse a list with this many elements @@ -120,8 +120,8 @@ cdef inline tuple parse_sdict(bytes data, int elem_count, int starting_position) return offset, dct -cdef bint can_be_encoded_as_a_dict(dict dct): - for key, value in dct.items(): +cdef inline bint can_be_encoded_as_a_dict(dict dct): + for key in dct.keys(): if not isinstance(key, str): return False if len(key) > 255: @@ -167,16 +167,13 @@ cpdef tuple parse(bytes data, int starting_position): raise DecodingError('Invalid UTF-8') from e elif value_type & 0xF0 == 0x40: elements = value_type & 0xF - e_list = [] string_length, e_list = parse_list(data, elements, starting_position+1) return string_length+1, e_list elif value_type & 0xF0 == 0x50: - e_dict = {} elements = value_type & 0xF offset, e_dict = parse_dict(data, elements, starting_position+1) return offset+1, e_dict elif value_type & 0xF0 == 0x60: - e_dict = {} elements = value_type & 0xF offset, e_dict = parse_sdict(data, elements, starting_position+1) return offset+1, e_dict @@ -212,7 +209,6 @@ cpdef tuple parse(bytes data, int starting_position): return 2, sint8 elif value_type == 7: elements = data[starting_position+1] - e_list = [] offset, e_list = parse_list(data, elements, starting_position+2) return offset+2, e_list elif value_type == 8: @@ -226,7 +222,6 @@ cpdef tuple parse(bytes data, int starting_position): return 4, uint32 elif value_type == 11: elements = data[starting_position+1] - e_dict = {} offset, e_dict = parse_dict(data, elements, starting_position+2) return offset+2, e_dict elif value_type == 13: diff --git a/setup.cfg b/setup.cfg index de2ae17..6a25dc7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ # coding: utf-8 [metadata] -version = 2.1rc1 +version = 2.1rc2 name = minijson long-description = file: README.md long-description-content-type = text/markdown; charset=UTF-8 -- GitLab