From 8a758f5b99c5fc3fd32edeac049d7d4a4b7cc163 Mon Sep 17 00:00:00 2001 From: Marco Paolini Date: Tue, 30 Jul 2019 15:16:34 +0100 Subject: [PATCH] bpo-37587: Make json.loads faster for long strings (GH-14752) When scanning the string, most characters are valid, so checking for invalid characters first means never needing to check the value of strict on valid strings, and only needing to check it on invalid characters when doing non-strict parsing of invalid strings. This provides a measurable reduction in per-character processing time (~11% in the pre-merge patch testing). --- .../next/Library/2019-07-13-16-02-48.bpo-37587.fd-1aF.rst | 1 + Modules/_json.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-07-13-16-02-48.bpo-37587.fd-1aF.rst diff --git a/Misc/NEWS.d/next/Library/2019-07-13-16-02-48.bpo-37587.fd-1aF.rst b/Misc/NEWS.d/next/Library/2019-07-13-16-02-48.bpo-37587.fd-1aF.rst new file mode 100644 index 00000000000..80a89feab0c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-07-13-16-02-48.bpo-37587.fd-1aF.rst @@ -0,0 +1 @@ +Make json.loads faster for long strings. (Patch by Marco Paolini) diff --git a/Modules/_json.c b/Modules/_json.c index 38beb6f50d2..76da1d345e9 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -439,7 +439,7 @@ scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next if (c == '"' || c == '\\') { break; } - else if (strict && c <= 0x1f) { + else if (c <= 0x1f && strict) { raise_errmsg("Invalid control character at", pystr, next); goto bail; }