datrie


Namedatrie JSON
Version 0.8.2 PyPI version JSON
download
home_pagehttps://github.com/kmike/datrie
SummarySuper-fast, efficiently stored Trie for Python.
upload_time2020-03-26 03:31:53
maintainer
docs_urlNone
authorMikhail Korobov
requires_python>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*
licenseLGPLv2+
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI
coveralls test coverage No coveralls.
            datrie |travis| |appveyor|
==========================

.. |travis| image:: https://travis-ci.org/pytries/datrie.svg
   :target: https://travis-ci.org/pytries/datrie

.. |appveyor| image:: https://ci.appveyor.com/api/projects/status/6bpvhllpjhlau7x0?svg=true
   :target: https://ci.appveyor.com/project/superbobry/datrie

Super-fast, efficiently stored Trie for Python (2.x and 3.x).
Uses `libdatrie`_.

.. _libdatrie: https://linux.thai.net/~thep/datrie/datrie.html

Installation
============

::

    pip install datrie

Usage
=====

Create a new trie capable of storing items with lower-case ascii keys::

    >>> import string
    >>> import datrie
    >>> trie = datrie.Trie(string.ascii_lowercase)

``trie`` variable is a dict-like object that can have unicode keys of
certain ranges and Python objects as values.

In addition to implementing the mapping interface, tries facilitate
finding the items for a given prefix, and vice versa, finding the
items whose keys are prefixes of a given string. As a common special
case, finding the longest-prefix item is also supported.

.. warning::

    For efficiency you must define allowed character range(s) while
    creating trie. ``datrie`` doesn't check if keys are in allowed
    ranges at runtime, so be careful! Invalid keys are OK at lookup time
    but values won't be stored correctly for such keys.

Add some values to it (datrie keys must be unicode; the examples
are for Python 2.x)::

    >>> trie[u'foo'] = 5
    >>> trie[u'foobar'] = 10
    >>> trie[u'bar'] = 'bar value'
    >>> trie.setdefault(u'foobar', 15)
    10

Check if u'foo' is in trie::

    >>> u'foo' in trie
    True

Get a value::

    >>> trie[u'foo']
    5

Find all prefixes of a word::

    >>> trie.prefixes(u'foobarbaz')
    [u'foo', u'foobar']

    >>> trie.prefix_items(u'foobarbaz')
    [(u'foo', 5), (u'foobar', 10)]

    >>> trie.iter_prefixes(u'foobarbaz')
    <generator object ...>

    >>> trie.iter_prefix_items(u'foobarbaz')
    <generator object ...>

Find the longest prefix of a word::

    >>> trie.longest_prefix(u'foo')
    u'foo'

    >>> trie.longest_prefix(u'foobarbaz')
    u'foobar'

    >>> trie.longest_prefix(u'gaz')
    KeyError: u'gaz'

    >>> trie.longest_prefix(u'gaz', default=u'vasia')
    u'vasia'

    >>> trie.longest_prefix_item(u'foobarbaz')
    (u'foobar', 10)

Check if the trie has keys with a given prefix::

    >>> trie.has_keys_with_prefix(u'fo')
    True

    >>> trie.has_keys_with_prefix(u'FO')
    False

Get all items with a given prefix from a trie::

    >>> trie.keys(u'fo')
    [u'foo', u'foobar']

    >>> trie.items(u'ba')
    [(u'bar', 'bar value')]

    >>> trie.values(u'foob')
    [10]

Get all suffixes of certain word starting with a given prefix from a trie::

    >>> trie.suffixes()
    [u'pro', u'producer', u'producers', u'product', u'production', u'productivity', u'prof']
    >>> trie.suffixes(u'prod')
    [u'ucer', u'ucers', u'uct', u'uction', u'uctivity']


Save & load a trie (values must be picklable)::

    >>> trie.save('my.trie')
    >>> trie2 = datrie.Trie.load('my.trie')



Trie and BaseTrie
=================

There are two Trie classes in datrie package: ``datrie.Trie`` and
``datrie.BaseTrie``. ``datrie.BaseTrie`` is slightly faster and uses less
memory but it can store only integer numbers -2147483648 <= x <= 2147483647.
``datrie.Trie`` is a bit slower but can store any Python object as a value.

If you don't need values or integer values are OK then use ``datrie.BaseTrie``::

    import datrie
    import string
    trie = datrie.BaseTrie(string.ascii_lowercase)

Custom iteration
================

If the built-in trie methods don't fit you can use ``datrie.State`` and
``datrie.Iterator`` to implement custom traversal.

.. note::

    If you use ``datrie.BaseTrie`` you need ``datrie.BaseState`` and
    ``datrie.BaseIterator`` for custom traversal.


For example, let's find all suffixes of ``'fo'`` for our trie and get
the values::

    >>> state = datrie.State(trie)
    >>> state.walk(u'foo')
    >>> it = datrie.Iterator(state)
    >>> while it.next():
    ...     print(it.key())
    ...     print(it.data))
    o
    5
    obar
    10

Performance
===========

Performance is measured for ``datrie.Trie`` against Python's dict with
100k unique unicode words (English and Russian) as keys and '1' numbers
as values.

``datrie.Trie`` uses about 5M memory for 100k words; Python's dict
uses about 22M for this according to my unscientific tests.

This trie implementation is 2-6 times slower than python's dict
on __getitem__. Benchmark results (macbook air i5 1.8GHz,
"1.000M ops/sec" == "1 000 000 operations per second")::

    Python 2.6:
    dict __getitem__: 7.107M ops/sec
    trie __getitem__: 2.478M ops/sec

    Python 2.7:
    dict __getitem__: 6.550M ops/sec
    trie __getitem__: 2.474M ops/sec

    Python 3.2:
    dict __getitem__: 8.185M ops/sec
    trie __getitem__: 2.684M ops/sec

    Python 3.3:
    dict __getitem__: 7.050M ops/sec
    trie __getitem__: 2.755M ops/sec

Looking for prefixes of a given word is almost as fast as
``__getitem__`` (results are for Python 3.3)::

    trie.iter_prefix_items (hits):      0.461M ops/sec
    trie.prefix_items (hits):           0.743M ops/sec
    trie.prefix_items loop (hits):      0.629M ops/sec
    trie.iter_prefixes (hits):          0.759M ops/sec
    trie.iter_prefixes (misses):        1.538M ops/sec
    trie.iter_prefixes (mixed):         1.359M ops/sec
    trie.has_keys_with_prefix (hits):   1.896M ops/sec
    trie.has_keys_with_prefix (misses): 2.590M ops/sec
    trie.longest_prefix (hits):         1.710M ops/sec
    trie.longest_prefix (misses):       1.506M ops/sec
    trie.longest_prefix (mixed):        1.520M ops/sec
    trie.longest_prefix_item (hits):    1.276M ops/sec
    trie.longest_prefix_item (misses):  1.292M ops/sec
    trie.longest_prefix_item (mixed):   1.379M ops/sec

Looking for all words starting with a given prefix is mostly limited
by overall result count (this can be improved in future because a
lot of time is spent decoding strings from utf_32_le to Python's
unicode)::

    trie.items(prefix="xxx"), avg_len(res)==415:        0.609K ops/sec
    trie.keys(prefix="xxx"), avg_len(res)==415:         0.642K ops/sec
    trie.values(prefix="xxx"), avg_len(res)==415:       4.974K ops/sec
    trie.items(prefix="xxxxx"), avg_len(res)==17:       14.781K ops/sec
    trie.keys(prefix="xxxxx"), avg_len(res)==17:        15.766K ops/sec
    trie.values(prefix="xxxxx"), avg_len(res)==17:      96.456K ops/sec
    trie.items(prefix="xxxxxxxx"), avg_len(res)==3:     75.165K ops/sec
    trie.keys(prefix="xxxxxxxx"), avg_len(res)==3:      77.225K ops/sec
    trie.values(prefix="xxxxxxxx"), avg_len(res)==3:    320.755K ops/sec
    trie.items(prefix="xxxxx..xx"), avg_len(res)==1.4:  173.591K ops/sec
    trie.keys(prefix="xxxxx..xx"), avg_len(res)==1.4:   180.678K ops/sec
    trie.values(prefix="xxxxx..xx"), avg_len(res)==1.4: 503.392K ops/sec
    trie.items(prefix="xxx"), NON_EXISTING:             2023.647K ops/sec
    trie.keys(prefix="xxx"), NON_EXISTING:              1976.928K ops/sec
    trie.values(prefix="xxx"), NON_EXISTING:            2060.372K ops/sec

Random insert time is very slow compared to dict, this is the limitation
of double-array tries; updates are quite fast. If you want to build a trie,
consider sorting keys before the insertion::

    dict __setitem__ (updates):            6.497M ops/sec
    trie __setitem__ (updates):            2.633M ops/sec
    dict __setitem__ (inserts, random):    5.808M ops/sec
    trie __setitem__ (inserts, random):    0.053M ops/sec
    dict __setitem__ (inserts, sorted):    5.749M ops/sec
    trie __setitem__ (inserts, sorted):    0.624M ops/sec
    dict setdefault (updates):             3.455M ops/sec
    trie setdefault (updates):             1.910M ops/sec
    dict setdefault (inserts):             3.466M ops/sec
    trie setdefault (inserts):             0.053M ops/sec

Other results (note that ``len(trie)`` is currently implemented
using trie traversal)::

    dict __contains__ (hits):    6.801M ops/sec
    trie __contains__ (hits):    2.816M ops/sec
    dict __contains__ (misses):  5.470M ops/sec
    trie __contains__ (misses):  4.224M ops/sec
    dict __len__:                334336.269 ops/sec
    trie __len__:                22.900 ops/sec
    dict values():               406.507 ops/sec
    trie values():               20.864 ops/sec
    dict keys():                 189.298 ops/sec
    trie keys():                 2.773 ops/sec
    dict items():                48.734 ops/sec
    trie items():                2.611 ops/sec

Please take this benchmark results with a grain of salt; this
is a very simple benchmark and may not cover your use case.

Current Limitations
===================

* keys must be unicode (no implicit conversion for byte strings
  under Python 2.x, sorry);
* there are no iterator versions of keys/values/items (this is not
  implemented yet);
* it is painfully slow and maybe buggy under pypy;
* library is not tested with narrow Python builds.

Contributing
============

Development happens at github: https://github.com/pytries/datrie.

Feel free to submit ideas, bugs, pull requests.

Running tests and benchmarks
----------------------------

Make sure `tox`_ is installed and run

::

    $ tox

from the source checkout. Tests should pass under Python 2.7 and 3.4+.

::

    $ tox -c tox-bench.ini

runs benchmarks.

If you've changed anything in the source code then
make sure `cython`_ is installed and run

::

    $ update_c.sh

before each ``tox`` command.

Please note that benchmarks are not included in the release
tar.gz's because benchmark data is large and this
saves a lot of bandwidth; use source checkouts from
github or bitbucket for the benchmarks.

.. _cython: https://cython.org/
.. _tox: https://tox.readthedocs.io/

Authors & Contributors
----------------------

See https://github.com/pytries/datrie/graphs/contributors.

This module is based on `libdatrie`_ C library by Theppitak Karoonboonyanan
and is inspired by `fast_trie`_ Ruby bindings, `PyTrie`_ pure
Python implementation and `Tree::Trie`_ Perl implementation;
some docs and API ideas are borrowed from these projects.

.. _fast_trie: https://github.com/tyler/trie
.. _PyTrie: https://github.com/gsakkis/pytrie
.. _Tree::Trie: https://metacpan.org/pod/release/AVIF/Tree-Trie-1.9/Trie.pm

License
=======

Licensed under LGPL v2.1.
CHANGES
=======

0.8.2 (2020-03-25)
------------------
* Future-proof Python support by making cython a build time dependency and
  removing cython generated c files from the repo (and sdist).
* Fix collections.abc.MutableMapping import
* CI and test updates
* Adjust library name to unbreak some linkers

0.8.1 (skipped)
---------------
This version intentionally skipped

0.8 (2019-07-03)
----------------
* Python 3.7 compatibility; extension is rebuilt with Cython 0.29.11.
* Trie.get function;
* Python 2.6 and 3.3 support is dropped;
* removed patch to libdatrie which is no longer required;
* testing and CI fixes.

0.7.1 (2016-03-12)
------------------

* updated the bundled C library to version 0.2.9;
* implemented ``Trie.__len__`` in terms of ``trie_enumerate``;
* rebuilt Cython wrapper with Cython 0.23.4;
* changed ``Trie`` to implement ``collections.abc.MutableMapping``;
* fixed ``Trie`` pickling, which segfaulted on Python2.X.

0.7 (2014-02-18)
----------------

* bundled libdatrie C library is updated to version 0.2.8;
* new `.suffixes()` method (thanks Ahmed T. Youssef);
* wrapper is rebuilt with Cython 0.20.1.

0.6.1 (2013-09-21)
------------------

* fixed build for Visual Studio (thanks Gabi Davar).

0.6 (2013-07-09)
----------------

* datrie is rebuilt with Cython 0.19.1;
* ``iter_prefix_values``, ``prefix_values`` and ``longest_prefix_value``
  methods for ``datrie.BaseTrie`` and ``datrie.Trie`` (thanks Jared Suttles).

0.5.1 (2013-01-30)
------------------

* Recently introduced memory leak in ``longest_prefix``
  and ``longest_prefix_item`` is fixed.

0.5 (2013-01-29)
----------------

* ``longest_prefix`` and ``longest_prefix_item`` methods are fixed;
* datrie is rebuilt with Cython 0.18;
* misleading benchmark results in README are fixed;
* State._walk is renamed to State.walk_char.

0.4.2 (2012-09-02)
------------------

* Update to latest libdatrie; this makes ``.keys()`` method a bit slower but
  removes a keys length limitation.

0.4.1 (2012-07-29)
------------------

* cPickle is used for saving/loading ``datrie.Trie`` if it is available.

0.4 (2012-07-27)
----------------

* ``libdatrie`` improvements and bugfixes, including C iterator API support;
* custom iteration support using ``datrie.State`` and ``datrie.Iterator``.
* speed improvements: ``__length__``, ``keys``, ``values`` and
  ``items`` methods should be up to 2x faster.
* keys longer than 32768 are not supported in this release.


0.3 (2012-07-21)
----------------

There are no new features or speed improvements in this release.

* ``datrie.new`` is deprecated; use ``datrie.Trie`` with the same arguments;
* small test & benchmark improvements.

0.2 (2012-07-16)
----------------

* ``datrie.Trie`` items can have any Python object as a value
  (``Trie`` from 0.1.x becomes ``datrie.BaseTrie``);
* ``longest_prefix`` and ``longest_prefix_items`` are fixed;
* ``save`` & ``load`` are rewritten;
* ``setdefault`` method.


0.1.1 (2012-07-13)
------------------

* Windows support (upstream libdatrie changes are merged);
* license is changed from LGPL v3 to LGPL v2.1 to match the libdatrie license.

0.1 (2012-07-12)
----------------

Initial release.
            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/kmike/datrie",
    "name": "datrie",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
    "maintainer_email": "",
    "keywords": "",
    "author": "Mikhail Korobov",
    "author_email": "kmike84@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/9d/fe/db74bd405d515f06657f11ad529878fd389576dca4812bea6f98d9b31574/datrie-0.8.2.tar.gz",
    "platform": "",
    "description": "datrie |travis| |appveyor|\n==========================\n\n.. |travis| image:: https://travis-ci.org/pytries/datrie.svg\n   :target: https://travis-ci.org/pytries/datrie\n\n.. |appveyor| image:: https://ci.appveyor.com/api/projects/status/6bpvhllpjhlau7x0?svg=true\n   :target: https://ci.appveyor.com/project/superbobry/datrie\n\nSuper-fast, efficiently stored Trie for Python (2.x and 3.x).\nUses `libdatrie`_.\n\n.. _libdatrie: https://linux.thai.net/~thep/datrie/datrie.html\n\nInstallation\n============\n\n::\n\n    pip install datrie\n\nUsage\n=====\n\nCreate a new trie capable of storing items with lower-case ascii keys::\n\n    >>> import string\n    >>> import datrie\n    >>> trie = datrie.Trie(string.ascii_lowercase)\n\n``trie`` variable is a dict-like object that can have unicode keys of\ncertain ranges and Python objects as values.\n\nIn addition to implementing the mapping interface, tries facilitate\nfinding the items for a given prefix, and vice versa, finding the\nitems whose keys are prefixes of a given string. As a common special\ncase, finding the longest-prefix item is also supported.\n\n.. warning::\n\n    For efficiency you must define allowed character range(s) while\n    creating trie. ``datrie`` doesn't check if keys are in allowed\n    ranges at runtime, so be careful! Invalid keys are OK at lookup time\n    but values won't be stored correctly for such keys.\n\nAdd some values to it (datrie keys must be unicode; the examples\nare for Python 2.x)::\n\n    >>> trie[u'foo'] = 5\n    >>> trie[u'foobar'] = 10\n    >>> trie[u'bar'] = 'bar value'\n    >>> trie.setdefault(u'foobar', 15)\n    10\n\nCheck if u'foo' is in trie::\n\n    >>> u'foo' in trie\n    True\n\nGet a value::\n\n    >>> trie[u'foo']\n    5\n\nFind all prefixes of a word::\n\n    >>> trie.prefixes(u'foobarbaz')\n    [u'foo', u'foobar']\n\n    >>> trie.prefix_items(u'foobarbaz')\n    [(u'foo', 5), (u'foobar', 10)]\n\n    >>> trie.iter_prefixes(u'foobarbaz')\n    <generator object ...>\n\n    >>> trie.iter_prefix_items(u'foobarbaz')\n    <generator object ...>\n\nFind the longest prefix of a word::\n\n    >>> trie.longest_prefix(u'foo')\n    u'foo'\n\n    >>> trie.longest_prefix(u'foobarbaz')\n    u'foobar'\n\n    >>> trie.longest_prefix(u'gaz')\n    KeyError: u'gaz'\n\n    >>> trie.longest_prefix(u'gaz', default=u'vasia')\n    u'vasia'\n\n    >>> trie.longest_prefix_item(u'foobarbaz')\n    (u'foobar', 10)\n\nCheck if the trie has keys with a given prefix::\n\n    >>> trie.has_keys_with_prefix(u'fo')\n    True\n\n    >>> trie.has_keys_with_prefix(u'FO')\n    False\n\nGet all items with a given prefix from a trie::\n\n    >>> trie.keys(u'fo')\n    [u'foo', u'foobar']\n\n    >>> trie.items(u'ba')\n    [(u'bar', 'bar value')]\n\n    >>> trie.values(u'foob')\n    [10]\n\nGet all suffixes of certain word starting with a given prefix from a trie::\n\n    >>> trie.suffixes()\n    [u'pro', u'producer', u'producers', u'product', u'production', u'productivity', u'prof']\n    >>> trie.suffixes(u'prod')\n    [u'ucer', u'ucers', u'uct', u'uction', u'uctivity']\n\n\nSave & load a trie (values must be picklable)::\n\n    >>> trie.save('my.trie')\n    >>> trie2 = datrie.Trie.load('my.trie')\n\n\n\nTrie and BaseTrie\n=================\n\nThere are two Trie classes in datrie package: ``datrie.Trie`` and\n``datrie.BaseTrie``. ``datrie.BaseTrie`` is slightly faster and uses less\nmemory but it can store only integer numbers -2147483648 <= x <= 2147483647.\n``datrie.Trie`` is a bit slower but can store any Python object as a value.\n\nIf you don't need values or integer values are OK then use ``datrie.BaseTrie``::\n\n    import datrie\n    import string\n    trie = datrie.BaseTrie(string.ascii_lowercase)\n\nCustom iteration\n================\n\nIf the built-in trie methods don't fit you can use ``datrie.State`` and\n``datrie.Iterator`` to implement custom traversal.\n\n.. note::\n\n    If you use ``datrie.BaseTrie`` you need ``datrie.BaseState`` and\n    ``datrie.BaseIterator`` for custom traversal.\n\n\nFor example, let's find all suffixes of ``'fo'`` for our trie and get\nthe values::\n\n    >>> state = datrie.State(trie)\n    >>> state.walk(u'foo')\n    >>> it = datrie.Iterator(state)\n    >>> while it.next():\n    ...     print(it.key())\n    ...     print(it.data))\n    o\n    5\n    obar\n    10\n\nPerformance\n===========\n\nPerformance is measured for ``datrie.Trie`` against Python's dict with\n100k unique unicode words (English and Russian) as keys and '1' numbers\nas values.\n\n``datrie.Trie`` uses about 5M memory for 100k words; Python's dict\nuses about 22M for this according to my unscientific tests.\n\nThis trie implementation is 2-6 times slower than python's dict\non __getitem__. Benchmark results (macbook air i5 1.8GHz,\n\"1.000M ops/sec\" == \"1 000 000 operations per second\")::\n\n    Python 2.6:\n    dict __getitem__: 7.107M ops/sec\n    trie __getitem__: 2.478M ops/sec\n\n    Python 2.7:\n    dict __getitem__: 6.550M ops/sec\n    trie __getitem__: 2.474M ops/sec\n\n    Python 3.2:\n    dict __getitem__: 8.185M ops/sec\n    trie __getitem__: 2.684M ops/sec\n\n    Python 3.3:\n    dict __getitem__: 7.050M ops/sec\n    trie __getitem__: 2.755M ops/sec\n\nLooking for prefixes of a given word is almost as fast as\n``__getitem__`` (results are for Python 3.3)::\n\n    trie.iter_prefix_items (hits):      0.461M ops/sec\n    trie.prefix_items (hits):           0.743M ops/sec\n    trie.prefix_items loop (hits):      0.629M ops/sec\n    trie.iter_prefixes (hits):          0.759M ops/sec\n    trie.iter_prefixes (misses):        1.538M ops/sec\n    trie.iter_prefixes (mixed):         1.359M ops/sec\n    trie.has_keys_with_prefix (hits):   1.896M ops/sec\n    trie.has_keys_with_prefix (misses): 2.590M ops/sec\n    trie.longest_prefix (hits):         1.710M ops/sec\n    trie.longest_prefix (misses):       1.506M ops/sec\n    trie.longest_prefix (mixed):        1.520M ops/sec\n    trie.longest_prefix_item (hits):    1.276M ops/sec\n    trie.longest_prefix_item (misses):  1.292M ops/sec\n    trie.longest_prefix_item (mixed):   1.379M ops/sec\n\nLooking for all words starting with a given prefix is mostly limited\nby overall result count (this can be improved in future because a\nlot of time is spent decoding strings from utf_32_le to Python's\nunicode)::\n\n    trie.items(prefix=\"xxx\"), avg_len(res)==415:        0.609K ops/sec\n    trie.keys(prefix=\"xxx\"), avg_len(res)==415:         0.642K ops/sec\n    trie.values(prefix=\"xxx\"), avg_len(res)==415:       4.974K ops/sec\n    trie.items(prefix=\"xxxxx\"), avg_len(res)==17:       14.781K ops/sec\n    trie.keys(prefix=\"xxxxx\"), avg_len(res)==17:        15.766K ops/sec\n    trie.values(prefix=\"xxxxx\"), avg_len(res)==17:      96.456K ops/sec\n    trie.items(prefix=\"xxxxxxxx\"), avg_len(res)==3:     75.165K ops/sec\n    trie.keys(prefix=\"xxxxxxxx\"), avg_len(res)==3:      77.225K ops/sec\n    trie.values(prefix=\"xxxxxxxx\"), avg_len(res)==3:    320.755K ops/sec\n    trie.items(prefix=\"xxxxx..xx\"), avg_len(res)==1.4:  173.591K ops/sec\n    trie.keys(prefix=\"xxxxx..xx\"), avg_len(res)==1.4:   180.678K ops/sec\n    trie.values(prefix=\"xxxxx..xx\"), avg_len(res)==1.4: 503.392K ops/sec\n    trie.items(prefix=\"xxx\"), NON_EXISTING:             2023.647K ops/sec\n    trie.keys(prefix=\"xxx\"), NON_EXISTING:              1976.928K ops/sec\n    trie.values(prefix=\"xxx\"), NON_EXISTING:            2060.372K ops/sec\n\nRandom insert time is very slow compared to dict, this is the limitation\nof double-array tries; updates are quite fast. If you want to build a trie,\nconsider sorting keys before the insertion::\n\n    dict __setitem__ (updates):            6.497M ops/sec\n    trie __setitem__ (updates):            2.633M ops/sec\n    dict __setitem__ (inserts, random):    5.808M ops/sec\n    trie __setitem__ (inserts, random):    0.053M ops/sec\n    dict __setitem__ (inserts, sorted):    5.749M ops/sec\n    trie __setitem__ (inserts, sorted):    0.624M ops/sec\n    dict setdefault (updates):             3.455M ops/sec\n    trie setdefault (updates):             1.910M ops/sec\n    dict setdefault (inserts):             3.466M ops/sec\n    trie setdefault (inserts):             0.053M ops/sec\n\nOther results (note that ``len(trie)`` is currently implemented\nusing trie traversal)::\n\n    dict __contains__ (hits):    6.801M ops/sec\n    trie __contains__ (hits):    2.816M ops/sec\n    dict __contains__ (misses):  5.470M ops/sec\n    trie __contains__ (misses):  4.224M ops/sec\n    dict __len__:                334336.269 ops/sec\n    trie __len__:                22.900 ops/sec\n    dict values():               406.507 ops/sec\n    trie values():               20.864 ops/sec\n    dict keys():                 189.298 ops/sec\n    trie keys():                 2.773 ops/sec\n    dict items():                48.734 ops/sec\n    trie items():                2.611 ops/sec\n\nPlease take this benchmark results with a grain of salt; this\nis a very simple benchmark and may not cover your use case.\n\nCurrent Limitations\n===================\n\n* keys must be unicode (no implicit conversion for byte strings\n  under Python 2.x, sorry);\n* there are no iterator versions of keys/values/items (this is not\n  implemented yet);\n* it is painfully slow and maybe buggy under pypy;\n* library is not tested with narrow Python builds.\n\nContributing\n============\n\nDevelopment happens at github: https://github.com/pytries/datrie.\n\nFeel free to submit ideas, bugs, pull requests.\n\nRunning tests and benchmarks\n----------------------------\n\nMake sure `tox`_ is installed and run\n\n::\n\n    $ tox\n\nfrom the source checkout. Tests should pass under Python 2.7 and 3.4+.\n\n::\n\n    $ tox -c tox-bench.ini\n\nruns benchmarks.\n\nIf you've changed anything in the source code then\nmake sure `cython`_ is installed and run\n\n::\n\n    $ update_c.sh\n\nbefore each ``tox`` command.\n\nPlease note that benchmarks are not included in the release\ntar.gz's because benchmark data is large and this\nsaves a lot of bandwidth; use source checkouts from\ngithub or bitbucket for the benchmarks.\n\n.. _cython: https://cython.org/\n.. _tox: https://tox.readthedocs.io/\n\nAuthors & Contributors\n----------------------\n\nSee https://github.com/pytries/datrie/graphs/contributors.\n\nThis module is based on `libdatrie`_ C library by Theppitak Karoonboonyanan\nand is inspired by `fast_trie`_ Ruby bindings, `PyTrie`_ pure\nPython implementation and `Tree::Trie`_ Perl implementation;\nsome docs and API ideas are borrowed from these projects.\n\n.. _fast_trie: https://github.com/tyler/trie\n.. _PyTrie: https://github.com/gsakkis/pytrie\n.. _Tree::Trie: https://metacpan.org/pod/release/AVIF/Tree-Trie-1.9/Trie.pm\n\nLicense\n=======\n\nLicensed under LGPL v2.1.\nCHANGES\n=======\n\n0.8.2 (2020-03-25)\n------------------\n* Future-proof Python support by making cython a build time dependency and\n  removing cython generated c files from the repo (and sdist).\n* Fix collections.abc.MutableMapping import\n* CI and test updates\n* Adjust library name to unbreak some linkers\n\n0.8.1 (skipped)\n---------------\nThis version intentionally skipped\n\n0.8 (2019-07-03)\n----------------\n* Python 3.7 compatibility; extension is rebuilt with Cython 0.29.11.\n* Trie.get function;\n* Python 2.6 and 3.3 support is dropped;\n* removed patch to libdatrie which is no longer required;\n* testing and CI fixes.\n\n0.7.1 (2016-03-12)\n------------------\n\n* updated the bundled C library to version 0.2.9;\n* implemented ``Trie.__len__`` in terms of ``trie_enumerate``;\n* rebuilt Cython wrapper with Cython 0.23.4;\n* changed ``Trie`` to implement ``collections.abc.MutableMapping``;\n* fixed ``Trie`` pickling, which segfaulted on Python2.X.\n\n0.7 (2014-02-18)\n----------------\n\n* bundled libdatrie C library is updated to version 0.2.8;\n* new `.suffixes()` method (thanks Ahmed T. Youssef);\n* wrapper is rebuilt with Cython 0.20.1.\n\n0.6.1 (2013-09-21)\n------------------\n\n* fixed build for Visual Studio (thanks Gabi Davar).\n\n0.6 (2013-07-09)\n----------------\n\n* datrie is rebuilt with Cython 0.19.1;\n* ``iter_prefix_values``, ``prefix_values`` and ``longest_prefix_value``\n  methods for ``datrie.BaseTrie`` and ``datrie.Trie`` (thanks Jared Suttles).\n\n0.5.1 (2013-01-30)\n------------------\n\n* Recently introduced memory leak in ``longest_prefix``\n  and ``longest_prefix_item`` is fixed.\n\n0.5 (2013-01-29)\n----------------\n\n* ``longest_prefix`` and ``longest_prefix_item`` methods are fixed;\n* datrie is rebuilt with Cython 0.18;\n* misleading benchmark results in README are fixed;\n* State._walk is renamed to State.walk_char.\n\n0.4.2 (2012-09-02)\n------------------\n\n* Update to latest libdatrie; this makes ``.keys()`` method a bit slower but\n  removes a keys length limitation.\n\n0.4.1 (2012-07-29)\n------------------\n\n* cPickle is used for saving/loading ``datrie.Trie`` if it is available.\n\n0.4 (2012-07-27)\n----------------\n\n* ``libdatrie`` improvements and bugfixes, including C iterator API support;\n* custom iteration support using ``datrie.State`` and ``datrie.Iterator``.\n* speed improvements: ``__length__``, ``keys``, ``values`` and\n  ``items`` methods should be up to 2x faster.\n* keys longer than 32768 are not supported in this release.\n\n\n0.3 (2012-07-21)\n----------------\n\nThere are no new features or speed improvements in this release.\n\n* ``datrie.new`` is deprecated; use ``datrie.Trie`` with the same arguments;\n* small test & benchmark improvements.\n\n0.2 (2012-07-16)\n----------------\n\n* ``datrie.Trie`` items can have any Python object as a value\n  (``Trie`` from 0.1.x becomes ``datrie.BaseTrie``);\n* ``longest_prefix`` and ``longest_prefix_items`` are fixed;\n* ``save`` & ``load`` are rewritten;\n* ``setdefault`` method.\n\n\n0.1.1 (2012-07-13)\n------------------\n\n* Windows support (upstream libdatrie changes are merged);\n* license is changed from LGPL v3 to LGPL v2.1 to match the libdatrie license.\n\n0.1 (2012-07-12)\n----------------\n\nInitial release.",
    "bugtrack_url": null,
    "license": "LGPLv2+",
    "summary": "Super-fast, efficiently stored Trie for Python.",
    "version": "0.8.2",
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "3704eb7b5ba0244039abe8ba9d2a2413",
                "sha256": "53969643e2794c37f024d5edaa42d5e6e2627d9937ddcc18d99128e9df700e4c"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp27-cp27m-macosx_10_7_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3704eb7b5ba0244039abe8ba9d2a2413",
            "packagetype": "bdist_wheel",
            "python_version": "cp27",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 156586,
            "upload_time": "2020-03-26T03:32:02",
            "upload_time_iso_8601": "2020-03-26T03:32:02.040449Z",
            "url": "https://files.pythonhosted.org/packages/59/48/3ae10482706efd3acb732a2d60e03c613a38e2d41eddf0b84ec40a6ae753/datrie-0.8.2-cp27-cp27m-macosx_10_7_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "7b7312c62d7fd7f9a6cf3ce7de6e6755",
                "sha256": "6c9b333035312b79e6e9a10356d033e3d29aadbae6365007f706c854b3a94674"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp27-cp27m-manylinux1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7b7312c62d7fd7f9a6cf3ce7de6e6755",
            "packagetype": "bdist_wheel",
            "python_version": "cp27",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 469616,
            "upload_time": "2020-03-26T03:32:03",
            "upload_time_iso_8601": "2020-03-26T03:32:03.501250Z",
            "url": "https://files.pythonhosted.org/packages/45/83/062eb20c581f6e90b0fc52b2093f72f4d9d47efbc4010bab82957e00e840/datrie-0.8.2-cp27-cp27m-manylinux1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "d97b50a58826f328dd773d2949d25486",
                "sha256": "bf5c956c0a9a9d0f07e3c8923746279171096de18a8a51685e22d9817f8755a6"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp27-cp27mu-manylinux1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d97b50a58826f328dd773d2949d25486",
            "packagetype": "bdist_wheel",
            "python_version": "cp27",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 470074,
            "upload_time": "2020-03-26T03:32:05",
            "upload_time_iso_8601": "2020-03-26T03:32:05.244384Z",
            "url": "https://files.pythonhosted.org/packages/88/42/3abe71838ad52622ca3601265969fa76c1653d2fa82486cfa710f1478b53/datrie-0.8.2-cp27-cp27mu-manylinux1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "8ff8445be1afbd1b2aab54ae0148516f",
                "sha256": "c783e2c1e28964b2b045a951eb9606833a188c4bd4a780da68d22f557e03e429"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp27-cp27m-win32.whl",
            "has_sig": false,
            "md5_digest": "8ff8445be1afbd1b2aab54ae0148516f",
            "packagetype": "bdist_wheel",
            "python_version": "cp27",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 98498,
            "upload_time": "2020-03-26T12:05:33",
            "upload_time_iso_8601": "2020-03-26T12:05:33.641170Z",
            "url": "https://files.pythonhosted.org/packages/de/d2/e12df67208304d41c0a8bea798f309c1fee7a351610bf0bf64aaf17081aa/datrie-0.8.2-cp27-cp27m-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "394b05ffa8c47c8d2301fb96835adc12",
                "sha256": "f826e843138698501cbf1a21233f724b851b1e475fad532b638ac5904e115f10"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp27-cp27m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "394b05ffa8c47c8d2301fb96835adc12",
            "packagetype": "bdist_wheel",
            "python_version": "cp27",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 117952,
            "upload_time": "2020-03-26T12:05:35",
            "upload_time_iso_8601": "2020-03-26T12:05:35.379930Z",
            "url": "https://files.pythonhosted.org/packages/13/8b/e99e7d438e4a57e8f4feb086adf81b476981677991485f2404271512cdce/datrie-0.8.2-cp27-cp27m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "d34ed3c8a3f340a0f6d05703715bd39d",
                "sha256": "2de594d84a2f43a09ddc15316a8afd48aae0fdc456f9279d0940aa59c473d9d5"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp34-cp34m-manylinux1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d34ed3c8a3f340a0f6d05703715bd39d",
            "packagetype": "bdist_wheel",
            "python_version": "cp34",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 541208,
            "upload_time": "2020-03-26T03:32:06",
            "upload_time_iso_8601": "2020-03-26T03:32:06.497919Z",
            "url": "https://files.pythonhosted.org/packages/fc/e9/0db8800a4c8dc197fc55a11102fe3a02e064d8966b1cadcabbaa51861344/datrie-0.8.2-cp34-cp34m-manylinux1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "aa3d82f58d0a3e91e3205432372b8c1f",
                "sha256": "651c63325056347b86c5de7ffeea8529230a5787c61ee6dcabc5b6c644bd3252"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp35-cp35m-macosx_10_6_x86_64.whl",
            "has_sig": false,
            "md5_digest": "aa3d82f58d0a3e91e3205432372b8c1f",
            "packagetype": "bdist_wheel",
            "python_version": "cp35",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 157855,
            "upload_time": "2020-03-26T03:32:08",
            "upload_time_iso_8601": "2020-03-26T03:32:08.129134Z",
            "url": "https://files.pythonhosted.org/packages/87/be/c2c2ece6536da2886e67de40c04f4369c50de107ec3541aeb29b91a75840/datrie-0.8.2-cp35-cp35m-macosx_10_6_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "f493ea119d88e16e942f1e21745ef4a2",
                "sha256": "0e3b76676abbae2368cce6bf605bb0ba7cfd11f2c420b96d67959f353d5d423f"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp35-cp35m-manylinux1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f493ea119d88e16e942f1e21745ef4a2",
            "packagetype": "bdist_wheel",
            "python_version": "cp35",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 530405,
            "upload_time": "2020-03-26T03:32:09",
            "upload_time_iso_8601": "2020-03-26T03:32:09.702176Z",
            "url": "https://files.pythonhosted.org/packages/10/63/2ff02b530802832b0cbe0535c6b4e0024f2997286b2cbd18670eb5034907/datrie-0.8.2-cp35-cp35m-manylinux1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "656b98048ef71377d0b0e8183236a4d8",
                "sha256": "3a3e360a765cc95410898dc222f8585ea1b1bba0538a1af4d8630a5bc3ad6ee7"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp35-cp35m-win32.whl",
            "has_sig": false,
            "md5_digest": "656b98048ef71377d0b0e8183236a4d8",
            "packagetype": "bdist_wheel",
            "python_version": "cp35",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 97589,
            "upload_time": "2020-03-26T12:05:36",
            "upload_time_iso_8601": "2020-03-26T12:05:36.795153Z",
            "url": "https://files.pythonhosted.org/packages/e8/2d/88c334d2431ab56f1c9d3369b8f72d145ba949854f116afbadc27e54f63f/datrie-0.8.2-cp35-cp35m-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "0b1b1de770d516099b0ca5b4629fbfe0",
                "sha256": "fa9f39ac88dc6286672b9dd286fe459646da48133c877a927af24803eaea441e"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp35-cp35m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "0b1b1de770d516099b0ca5b4629fbfe0",
            "packagetype": "bdist_wheel",
            "python_version": "cp35",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 118756,
            "upload_time": "2020-03-26T12:05:38",
            "upload_time_iso_8601": "2020-03-26T12:05:38.302576Z",
            "url": "https://files.pythonhosted.org/packages/e6/3b/73b72d73960095401af0247463b42ddfe2ac60c177e0b7745e75c9eccc1b/datrie-0.8.2-cp35-cp35m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "7d6ee138262b8450be0cf21c3eba08ec",
                "sha256": "b6fd6c7c149b410a87d46072c1c98f6e87ec557802e1d0e09db7b858746e8550"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp36-cp36m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7d6ee138262b8450be0cf21c3eba08ec",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 162766,
            "upload_time": "2020-03-26T03:32:11",
            "upload_time_iso_8601": "2020-03-26T03:32:11.502053Z",
            "url": "https://files.pythonhosted.org/packages/9a/98/20763bc7b17f4a34c1d47a14cec0f9e6fee88994c21893a4e3e169ab3676/datrie-0.8.2-cp36-cp36m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "a9d50d12bdae471ca8cf833fdfb20004",
                "sha256": "327d9c17efaebc66d1956dca047b76fdd0e5b989d63cb55b9038ec09d8769089"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp36-cp36m-manylinux1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "a9d50d12bdae471ca8cf833fdfb20004",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 544893,
            "upload_time": "2020-03-26T03:32:12",
            "upload_time_iso_8601": "2020-03-26T03:32:12.960747Z",
            "url": "https://files.pythonhosted.org/packages/0b/e7/6c36d488e23f4b421b1351117417524ae2d3e138fdab83d23630c948199b/datrie-0.8.2-cp36-cp36m-manylinux1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "a86c69a6c83dd8cb308c17da18fe7dde",
                "sha256": "ee7cd8470a982356e104e62148f2dbe2d3e17545cafaa3ada29f2548984f1e89"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp36-cp36m-win32.whl",
            "has_sig": false,
            "md5_digest": "a86c69a6c83dd8cb308c17da18fe7dde",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 102035,
            "upload_time": "2020-03-26T12:05:39",
            "upload_time_iso_8601": "2020-03-26T12:05:39.653466Z",
            "url": "https://files.pythonhosted.org/packages/cb/80/ec497ad39dcaf9d20a990f1941e15516884d49e7adaf2a8f8b5830f0ede1/datrie-0.8.2-cp36-cp36m-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "136d669c98ef1c20e487027dce77f218",
                "sha256": "31e316ba305cdd7b8a42f8e4af5a0a15a628aee270d2f392c41329a709eeda6d"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp36-cp36m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "136d669c98ef1c20e487027dce77f218",
            "packagetype": "bdist_wheel",
            "python_version": "cp36",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 122977,
            "upload_time": "2020-03-26T12:05:40",
            "upload_time_iso_8601": "2020-03-26T12:05:40.976377Z",
            "url": "https://files.pythonhosted.org/packages/9e/1f/519da60d031bd44d40fb69e4a3650dbfd072c3727cbc7d171f1f895290cf/datrie-0.8.2-cp36-cp36m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "3c6d37dbc92eadd8d6c1ec3025b66888",
                "sha256": "dbe04704eb41b8440ca61416d3670ca6ddeea847d19731cf121889bac2962d07"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp37-cp37m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3c6d37dbc92eadd8d6c1ec3025b66888",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 154642,
            "upload_time": "2020-03-26T03:32:14",
            "upload_time_iso_8601": "2020-03-26T03:32:14.705156Z",
            "url": "https://files.pythonhosted.org/packages/22/32/14e19f05007ecc0c3872aa2ffc9a160c4d89fd42310f3864c0399bd8bf20/datrie-0.8.2-cp37-cp37m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "74fc618e8aa368d38a1522540b942d46",
                "sha256": "e1d704ee4fdc03f02d7dacc4d92052dbd490dba551509fccfd8ee52c9039d4ad"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp37-cp37m-manylinux1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "74fc618e8aa368d38a1522540b942d46",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 537390,
            "upload_time": "2020-03-26T03:32:16",
            "upload_time_iso_8601": "2020-03-26T03:32:16.076480Z",
            "url": "https://files.pythonhosted.org/packages/90/f8/c6daa335b0b5f3a6932e8b62b6f848e87c7f855ab6e94376051c9e228553/datrie-0.8.2-cp37-cp37m-manylinux1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "1350cb5e762528a03f7585c4779ab391",
                "sha256": "25e9e07ecfceaef78d23bde8d7278e4d6f63e1e3dc5ac00ccb4bec3062f0a8e0"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp37-cp37m-win32.whl",
            "has_sig": false,
            "md5_digest": "1350cb5e762528a03f7585c4779ab391",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 107623,
            "upload_time": "2020-03-26T12:05:42",
            "upload_time_iso_8601": "2020-03-26T12:05:42.163643Z",
            "url": "https://files.pythonhosted.org/packages/6f/12/7954d20ae5f0b5e1dbf2ec948b3c750db21a8bf05e560fef0f725fdd1d8f/datrie-0.8.2-cp37-cp37m-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "bd4593c06f4a78f89b8d4b83f958f9a7",
                "sha256": "bf9f34f7c63797219b32713b561c4f94e777ff6c22beecfcd6bdf6b6c25b8518"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "bd4593c06f4a78f89b8d4b83f958f9a7",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 130758,
            "upload_time": "2020-03-26T12:05:43",
            "upload_time_iso_8601": "2020-03-26T12:05:43.731272Z",
            "url": "https://files.pythonhosted.org/packages/ae/e3/9b5886b673ef34a36f7ca98d426dbf95b65999cf85bf4b75570bdcc42682/datrie-0.8.2-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "7f92dcbaf76231df5b7b16aeb7392573",
                "sha256": "e0582435a4adef1a2fce53aeedb656bf769b0f113b524f98be51d3e3d40720cb"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7f92dcbaf76231df5b7b16aeb7392573",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 157807,
            "upload_time": "2020-03-26T03:32:17",
            "upload_time_iso_8601": "2020-03-26T03:32:17.734776Z",
            "url": "https://files.pythonhosted.org/packages/2b/60/d5d83f080f2bf84902e7ede9b3776778433f6775c46eb296f78cf88ca197/datrie-0.8.2-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "51386144f9c0ff3bb902e2c793960931",
                "sha256": "b2d80fa687173cb8f8bae224ef00d1ad6bda8f8597bbb1a63f85182c7d91aeb3"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp38-cp38-manylinux1_x86_64.whl",
            "has_sig": false,
            "md5_digest": "51386144f9c0ff3bb902e2c793960931",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 551556,
            "upload_time": "2020-03-26T03:32:19",
            "upload_time_iso_8601": "2020-03-26T03:32:19.487988Z",
            "url": "https://files.pythonhosted.org/packages/3f/43/1ff434249b082c233afcb0217884a2cd542e4696900aace249e36b26df88/datrie-0.8.2-cp38-cp38-manylinux1_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "afe9cc7423c26ec4a75914fea58beadf",
                "sha256": "67603594f5db5c0029b1cf86a08e89cde015fe64cf0c4ae4e539c61114396729"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp38-cp38-win32.whl",
            "has_sig": false,
            "md5_digest": "afe9cc7423c26ec4a75914fea58beadf",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 110089,
            "upload_time": "2020-03-26T12:05:44",
            "upload_time_iso_8601": "2020-03-26T12:05:44.954075Z",
            "url": "https://files.pythonhosted.org/packages/90/de/580e485bca7a8f30ebd89c0a2efdbbae4f596f8dea5013713b9a3513e08f/datrie-0.8.2-cp38-cp38-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "29ecfd141a2862dc7616a7ab85598caf",
                "sha256": "f61cf2726f04c08828bfb4e7af698b0b16bdf2777c3993d042f2898b8e118f21"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "29ecfd141a2862dc7616a7ab85598caf",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 134726,
            "upload_time": "2020-03-26T12:05:46",
            "upload_time_iso_8601": "2020-03-26T12:05:46.821406Z",
            "url": "https://files.pythonhosted.org/packages/2d/69/909fb50e7b572dc0b5a43e499d8acbba2e314b578a8480cd92ca9425f9f8/datrie-0.8.2-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "99bf7ef877a592cb7299e8acb7545105",
                "sha256": "b07bd5fdfc3399a6dab86d6e35c72b1dbd598e80c97509c7c7518ab8774d3fda"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-pp273-pypy_73-win32.whl",
            "has_sig": false,
            "md5_digest": "99bf7ef877a592cb7299e8acb7545105",
            "packagetype": "bdist_wheel",
            "python_version": "pp273",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 91292,
            "upload_time": "2020-03-26T12:05:48",
            "upload_time_iso_8601": "2020-03-26T12:05:48.472567Z",
            "url": "https://files.pythonhosted.org/packages/44/02/53f0cf0bf0cd629ba6c2cc13f2f9db24323459e9c19463783d890a540a96/datrie-0.8.2-pp273-pypy_73-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "b333cb5b1964e5b17be0ddc3315f3099",
                "sha256": "89ff3d41df4f899387aa07b4b066f5da36e3a10b67b8aeae631c950502ff4503"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2-pp373-pypy36_pp73-win32.whl",
            "has_sig": false,
            "md5_digest": "b333cb5b1964e5b17be0ddc3315f3099",
            "packagetype": "bdist_wheel",
            "python_version": "pp373",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 90231,
            "upload_time": "2020-03-26T12:05:49",
            "upload_time_iso_8601": "2020-03-26T12:05:49.586785Z",
            "url": "https://files.pythonhosted.org/packages/c4/aa/94c42a2dd30c4923bffe3ab59e4416c3f7e72dbd32a89bcdd8d43ff1d5d7/datrie-0.8.2-pp373-pypy36_pp73-win32.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "0478ffb9b9a28e6192cc84d94c65a8fc",
                "sha256": "525b08f638d5cf6115df6ccd818e5a01298cd230b2dac91c8ff2e6499d18765d"
            },
            "downloads": -1,
            "filename": "datrie-0.8.2.tar.gz",
            "has_sig": true,
            "md5_digest": "0478ffb9b9a28e6192cc84d94c65a8fc",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*",
            "size": 63278,
            "upload_time": "2020-03-26T03:31:53",
            "upload_time_iso_8601": "2020-03-26T03:31:53.681295Z",
            "url": "https://files.pythonhosted.org/packages/9d/fe/db74bd405d515f06657f11ad529878fd389576dca4812bea6f98d9b31574/datrie-0.8.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2020-03-26 03:31:53",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "kmike",
    "github_project": "datrie",
    "travis_ci": true,
    "coveralls": false,
    "github_actions": false,
    "appveyor": true,
    "tox": true,
    "lcname": "datrie"
}
        
Elapsed time: 0.01427s