This library is obsolete! Python 3.5's collections.OrderedDict
was rewritten in C, and is now significantly faster than cyordereddict.OrderedDict
for almost all operations.
cyordereddict
The Python standard library's OrderedDict
ported to Cython. A drop-in
replacement that is 2-6x faster.
- Install:
pip install cyordereddict
- Dependencies:
- CPython (2.6, 2.7, 3.3 or 3.4) and a C compiler. Cython is only required for the dev version.
- Use:
from cyordereddict import OrderedDict
- Benchmarks:
Python 2.7:
Test Code Ratio (stdlib / cython) __init__
emptyOrderedDict()
1.8 __init__
listOrderedDict(list_data)
4.8 __init__
dictOrderedDict(dict_data)
4.6 __setitem__
ordereddict[0] = 0
8.6 __getitem__
ordereddict[0]
3 update
ordereddict.update(dict_data)
5.5 __iter__
list(ordereddict)
5.6 items
ordereddict.items()
5.9 __contains__
0 in ordereddict
2.3 Python 3.4:
Test Code Ratio (stdlib / cython) __init__
emptyOrderedDict()
1.5 __init__
listOrderedDict(list_data)
3.9 __init__
dictOrderedDict(dict_data)
4.2 __setitem__
ordereddict[0] = 0
8.4 __getitem__
ordereddict[0]
2.9 update
ordereddict.update(dict_data)
6.5 __iter__
list(ordereddict)
2.3 items
list(ordereddict.items())
2.1 __contains__
0 in ordereddict
2.3 To run these yourself, use
cyordereddict.benchmark()
- Cavaets:
cyorderedddict.OrderedDict
is an extension type (similar to the built-indict
) instead of a Python class. This is necessary for speed, but means that in a few pathological cases its behavior will differ fromcollections.OrderedDict
:- The
inspect
module does not work oncyorderedddict.OrderedDict
methods. - Extension types use slots instead of dictionaries, so you cannot add
custom attributes without making a subclass (e.g.,
OrderedDict.foo = 'bar'
will fail).
You can do anything else you might do with an OrderedDict, including subclassing: everything else passes the
collections.OrderedDict
test suite. We based the Cython code directly on the Python standard library, and thus use separate code bases for Python 2 and 3, specifically to reduce the potential for introducing new bugs or performance regressions.- The
- License:
- MIT. Based on the Python standard library, which is under the Python Software Foundation License.