Skip to content

Commit 54945de

Browse files
committed
Merge pull request #6137 from Komnomnomnom/json-0.13-slowdown
PERF: fix JSON performance regression from 0.12 (GH5765)
2 parents e16498a + a18e5e6 commit 54945de

File tree

5 files changed

+266
-143
lines changed

5 files changed

+266
-143
lines changed

doc/source/release.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ Bug Fixes
119119
- Regresssion in handling of empty Series as indexers to Series (:issue:`5877`)
120120
- Bug in internal caching, related to (:issue:`5727`)
121121
- Testing bug in reading json/msgpack from a non-filepath on windows under py3 (:issue:`5874`)
122+
- Fix performance regression in JSON IO (:issue:`5765`)
122123
- Bug when assigning to .ix[tuple(...)] (:issue:`5896`)
123124
- Bug in fully reindexing a Panel (:issue:`5905`)
124125
- Bug in idxmin/max with object dtypes (:issue:`5914`)

pandas/src/ujson/lib/ultrajsondec.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -894,15 +894,23 @@ JSOBJ JSON_DecodeObject(JSONObjectDecoder *dec, const char *buffer, size_t cbBuf
894894

895895
ds.dec = dec;
896896

897-
locale = strdup(setlocale(LC_NUMERIC, NULL));
898-
if (!locale)
897+
locale = setlocale(LC_NUMERIC, NULL);
898+
if (strcmp(locale, "C"))
899899
{
900-
return SetError(&ds, -1, "Could not reserve memory block");
900+
locale = strdup(locale);
901+
if (!locale)
902+
{
903+
return SetError(&ds, -1, "Could not reserve memory block");
904+
}
905+
setlocale(LC_NUMERIC, "C");
906+
ret = decode_any (&ds);
907+
setlocale(LC_NUMERIC, locale);
908+
free(locale);
909+
}
910+
else
911+
{
912+
ret = decode_any (&ds);
901913
}
902-
setlocale(LC_NUMERIC, "C");
903-
ret = decode_any (&ds);
904-
setlocale(LC_NUMERIC, locale);
905-
free(locale);
906914

907915
if (ds.escHeap)
908916
{

pandas/src/ujson/lib/ultrajsonenc.c

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -917,16 +917,24 @@ char *JSON_EncodeObject(JSOBJ obj, JSONObjectEncoder *enc, char *_buffer, size_t
917917
enc->end = enc->start + _cbBuffer;
918918
enc->offset = enc->start;
919919

920-
locale = strdup(setlocale(LC_NUMERIC, NULL));
921-
if (!locale)
920+
locale = setlocale(LC_NUMERIC, NULL);
921+
if (strcmp(locale, "C"))
922922
{
923-
SetError(NULL, enc, "Could not reserve memory block");
924-
return NULL;
923+
locale = strdup(locale);
924+
if (!locale)
925+
{
926+
SetError(NULL, enc, "Could not reserve memory block");
927+
return NULL;
928+
}
929+
setlocale(LC_NUMERIC, "C");
930+
encode (obj, enc, NULL, 0);
931+
setlocale(LC_NUMERIC, locale);
932+
free(locale);
933+
}
934+
else
935+
{
936+
encode (obj, enc, NULL, 0);
925937
}
926-
setlocale(LC_NUMERIC, "C");
927-
encode (obj, enc, NULL, 0);
928-
setlocale(LC_NUMERIC, locale);
929-
free(locale);
930938

931939
Buffer_Reserve(enc, 1);
932940
if (enc->errorMsg)

0 commit comments

Comments
 (0)