Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improves the deserialization speed by reducing object initialization overhead #284

Merged
merged 6 commits into from
Sep 19, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions amazon/ion/equivalence.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,21 @@
from math import isnan

from amazon.ion.core import IonType, Timestamp, TimestampPrecision, MICROSECOND_PRECISION, OffsetTZInfo, Multimap
from amazon.ion.ion_py_objects import IonPyNull_new, IonPyDecimal_new, IonPyInt_new, IonPyFloat_new, IonPyText_new, \
IonPyList_new, IonPyDict_new, IonPyBool_new, IonPySymbol_new
from amazon.ion.simple_types import _IonNature, IonPyList, IonPyDict, IonPyTimestamp, IonPyNull, IonPySymbol, \
IonPyText, IonPyDecimal, IonPyFloat
from amazon.ion.symbols import SymbolToken


def isinstance_of_ion_nature(obj):
cheqianh marked this conversation as resolved.
Show resolved Hide resolved
return isinstance(obj, _IonNature) or isinstance(obj, IonPyNull_new) \
or isinstance(obj, IonPyDecimal_new) or isinstance(obj, IonPyInt_new) \
or isinstance(obj, IonPyFloat_new) or isinstance(obj, IonPyText_new) \
or isinstance(obj, IonPyList_new) or isinstance(obj, IonPyDict_new) \
or isinstance(obj, IonPyBool_new) or isinstance(obj, IonPySymbol_new)


def ion_equals(a, b, timestamps_instants_only=False):
"""Tests two objects for equivalence under the Ion data model.

Expand Down Expand Up @@ -60,8 +70,8 @@ def _ion_equals_timestamps_data_model(a, b):
def _ion_equals(a, b, timestamp_comparison_func, recursive_comparison_func):
"""Compares a and b according to the description of the ion_equals method."""
for a, b in ((a, b), (b, a)): # Ensures that operand order does not matter.
if isinstance(a, _IonNature):
if isinstance(b, _IonNature):
if isinstance_of_ion_nature(a):
if isinstance_of_ion_nature(b):
# Both operands have _IonNature. Their IonTypes and annotations must be equivalent.
eq = a.ion_type is b.ion_type and _annotations_eq(a, b)
else:
Expand Down Expand Up @@ -120,8 +130,8 @@ def _sequences_eq(a, b, comparison_func):


def _structs_eq(a, b, comparison_func):
assert isinstance(a, (dict, Multimap))
if not isinstance(b, (dict, Multimap)):
assert isinstance(a, (dict, Multimap, IonPyDict_new))
if not isinstance(b, (dict, Multimap, IonPyDict_new)):
return False
dict_len = len(a)
if dict_len != len(b):
Expand All @@ -135,7 +145,7 @@ def _structs_eq(a, b, comparison_func):
break
if key not in b:
return False
if isinstance(a, Multimap) and isinstance(b, Multimap):
if isinstance(a, (IonPyDict_new, Multimap)) and isinstance(b, (IonPyDict_new, Multimap)):
values_a = a.get_all_values(key)
values_b = b.get_all_values(key)
if len(values_a) != len(values_b):
Expand Down
Loading