{ "info": { "author": "Martin Larralde", "author_email": "martin.larralde@embl.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Rust", "Topic :: Scientific/Engineering :: Medical Science Apps.", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "# `nanoset.py` [![starme](https://img.shields.io/github/stars/althonos/nanoset.py.svg?style=social&label=Star)](https://github.com/althonos/nanoset.py)\n\n*A memory-optimized wrapper for Python sets likely to be empty.*\n\n[![TravisCI](https://img.shields.io/travis/althonos/nanoset.py/master.svg?logo=travis&maxAge=600&style=flat-square)](https://travis-ci.org/althonos/nanoset.py/branches)\n[![AppVeyor](https://img.shields.io/appveyor/ci/althonos/nanoset-py/master?logo=appveyor&style=flat-square&maxAge=600)](https://ci.appveyor.com/project/althonos/nanoset-py)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square&maxAge=2678400)](https://choosealicense.com/licenses/mit/)\n[![Source](https://img.shields.io/badge/source-GitHub-303030.svg?maxAge=2678400&style=flat-square)](https://github.com/althonos/nanoset.py/)\n[![PyPI](https://img.shields.io/pypi/v/nanoset.svg?style=flat-square&maxAge=600)](https://pypi.org/project/nanoset)\n[![Crates](https://img.shields.io/crates/v/nanoset-py?style=flat-square&maxAge=600)](https://crates.io/crates/nanoset-py)\n[![Wheel](https://img.shields.io/pypi/wheel/nanoset.svg?style=flat-square&maxAge=3600)](https://pypi.org/project/nanoset/#files)\n[![Python Versions](https://img.shields.io/pypi/pyversions/nanoset.svg?style=flat-square&maxAge=600)](https://pypi.org/project/nanoset/#files)\n[![Python Implementations](https://img.shields.io/pypi/implementation/nanoset.svg?style=flat-square&maxAge=600)](https://pypi.org/project/nanoset/#files)\n[![Changelog](https://img.shields.io/badge/keep%20a-changelog-8A0707.svg?maxAge=2678400&style=flat-square)](https://github.com/althonos/nanoset.py/blob/master/CHANGELOG.md)\n[![GitHub issues](https://img.shields.io/github/issues/althonos/nanoset.py.svg?style=flat-square&maxAge=600)](https://github.com/althonos/nanoset.py/issues)\n\n## \u23f1\ufe0f TL;DR\n\nSave up to 85% of the memory used by empty `set` instances in your code with\na single line of code:\n```python\nfrom nanoset import PicoSet as set\n```\n\n## \ud83d\udea9 Table of Contents\n\n- [Overview](#-overview)\n * [About Python memory usage](#-about-python-memory-usage)\n * [Simple example usecase](#-simple-example-usecase)\n * [Implementation](#-implementation)\n * [Statistics](#-statistics)\n- [Installing](#-installing)\n- [API Reference](#-api-reference)\n- [License](#-license)\n\n\n## \ud83d\uddfa\ufe0f Overview\n\n### \ud83d\udc0f About Python memory usage\n\nPython is a great programming language (*fight me*), but sometimes you start\nquestioning why it does things in certain ways. Since Python 2.3, the standard\nlibrary provides the [`set`](https://docs.python.org/3.7/library/stdtypes.html#set)\ncollection, which is a specialized container for membership testing. On the\ncontrary to the ubiquitous [`list`](https://docs.python.org/3.7/library/stdtypes.html#list)\ncollection, `set` is not ordered (or, more accurately, *does not let you access\nthe order it stores the elements in*). The other feature of `set` is that just\nlike its mathematical counterpart, it does not allow duplicates, which is very\nuseful for some algorithms. However, **sets are memory-expensive**:\n```python\n>>> import sys\n>>> sys.getsizeof(list())\n72\n>>> sys.getsizeof(set())\n232\n```\n\nAn empty set takes more than three times the memory of an empty list! For some\ndata structures or objects with a lot of `set` attributes, they can quickly\ncause a very large part of the memory to be used for nothing. This is even more\nsad when you are used to [Rust](https://www.rust-lang.org/), where most\n[collections](https://doc.rust-lang.org/std/collections/) allocate lazily.\n**This is where `nanoset` comes to the rescue:**\n```python\n>>> import nanoset\n>>> sys.getsizeof(nanoset.NanoSet())\n56\n>>> sys.getsizeof(nanoset.PicoSet())\n24\n```\n\n*Actually, that's a lie, but keep reading*.\n\n### \ud83d\udca1 Simple example usecase\n\nLet's imagine we are building an ordered graph data structure, where we may\nwant to store [taxonomic data](https://en.wikipedia.org/wiki/Taxonomic_database),\nor any other kind of hierarchy. We can simply define the graphs and its nodes\nwith the two following classes:\n\n```python\nclass Graph:\n root: Node\n nodes: Dict[str, Node]\n\nclass Node:\n neighbors: Set[node]\n```\n\nThis makes adding an edge and querying for an edge existence between two nodes\nan `O(1)` operation, and iterating over all the nodes an `O(n)` operation, which\nis mot likely what we want here. We use `set` an dnot `list` because we want to\navoid storing an edge in duplicate, which is a sensible choice. But now let's\nlook at the [statistics](https://terminologies.gfbio.org/terminology/?ontology=NCBITAXON)\nof the [NCBITaxon](https://www.ncbi.nlm.nih.gov/taxonomy) project, the\ndatabase for Organismal Classification developed by the US National Center for\nBiotechnology Information:\n\n Metrics\n Number of classes*: 1595237 \n Number of individuals: 0\n Number of properties: 0\n Classes without definition: 1595237\n Classes without label: 0\n Average number of children: 12\n Classes with a single child: 40319\n Maximum number of children: 41761\n Classes with more than 25 children: 0\n Classes with more than 1 parent: 0\n Maximum depth: 38\n Number of leaves**: 1130671\n\nAccording to these, we are going to have **1,130,671** leaves for a total of\n**1,595,237** nodes, which means **70.8%** of empty sets. Now you may think:\n\n> Ok, I got this. But in this case, I just need a special case for leaves, where\n> instead of storing an empty set of `neighbors`, I store a reference to `None`\n> when that set would be empty. I can then replace that reference with an actual\n> set only when I want to add new edges from that node. Problem solved!\n\nWell, glad we are on the same level: this is what **`nanoset`** does for you!\n\n\n### \ud83d\udd28 Implementation\n\nActually, it's not magic at all. Just imagine a class `NanoSet` that works as\na [proxy](https://www.tutorialspoint.com/python_design_patterns/python_design_patterns_proxy.htm)\nto an actual Python `set` it wraps, but which is only allocated when some data\nactually needs to be stored:\n\n```python\nclass NanoSet(collections.abc.Set):\n\n def __init__(self, iterable=None):\n self.inner = None if iterable is None else set(iterable)\n\n def add(self, element):\n if self.inner is None:\n self.inner = set()\n self.inner.add(element)\n\n # ... the rest of the `set` API ...\n```\n\nThat's about it! However, doing it like so in Python would not be super\nefficient, as the resulting object would be **64** bytes. Using\n[slots](http://book.pythontips.com/en/latest/__slots__magic.html), this can be\nreduced to **56** bytes, which is on par to what we get with **`NanoSet`**.\n\n**Note that these values are only when the inner set is empty!** When actually\nallocating the set to store our values, we allocate an additional **232** bytes\nof data. This means that using **`NanoSet`** creates an overhead, since a\nnon-empty set will now weigh **288** bytes (**256** bytes for **`PicoSet`**).\n\n> Well, I was way better off with my approach of storing `Optional[Set]`\n> everywhere then, I don't want to pay any additional cost for nonempty sets!\n\nSure. But that would mean changing your whole code. And actually, you may not\ngain that much memory from doing that compared to using `nanoset`, since the\nonly time the wrapper performs badly is when you have a load factor of more than\n90%. Furthermore, just to give you some perspective, `sys.getsizeof(1)` is\n**24** bytes as well.\n\n> By the way, you didn't mention `PicoSet`. How did you manage to get that down\n> to **24** bytes, when a slotted Python object can't be less that **56** bytes?\n\nEasy: `PicoSet` is basically `NanoSet`, but without an implementation of the\n[Garbage Collector protocol](https://docs.python.org/3/c-api/gcsupport.html).\nThis saves us **32** bytes of object memory, but comes with a drawback: the\ngarbage collector cannot see the set allocated *inside* the `PicoSet`. This\ndoes not change anything for execution, but debugging with a memory profiler\nwill be harder. Here is an example where we allocate **1,000,000** singletons\nfirst with `NanoSet`, then with `PicoSet`, using\n[`guppy3`](https://pypi.org/project/guppy3/) to check the heap:\n\n```python\n>>> l = [nanoset.NanoSet({x}) for x in range(1000000)]\n>>> guppy.hpy().heap()\nPartition of a set of 3034170 objects. Total size = 328667393 bytes.\n Index Count % Size % Cumulative % Kind (class / dict of class)\n 0 1000041 33 232100648 71 232100648 71 set\n 1 1000000 33 56000000 17 288100648 88 nanoset.NanoSet\n ...\n 3 96 0 8712752 3 324838712 99 list\n ...\n```\n```python\n>>> l = [nanoset.PicoSet({x}) for x in range(1000000)]\n>>> guppy.hpy().heap()\nPartition of a set of 2034285 objects. Total size = 300668995 bytes.\n Index Count % Size % Cumulative % Kind (class / dict of class)\n 0 1000000 97 24000000 65 24000000 65 nanoset.PicoSet\n 1 96 0 8712752 24 32712752 89 list\n ...\n```\n\nOn the second run, we have about the same order of allocated memory, saving\n**28 MB** (**28** bytes saved by switched from `NanoSet` to `PicoSet` times\n**1,000,000** instances). However, the garbage collector has no idea where\nsome of the memory is, because `PicoSet` hides the sets it allocates (this is\nfine: it will be deallocated along with the `PicoSet`).\n\nAs such, I'd advise avoiding using `PicoSet` when debugging, which can be done\neasily with Python's `__debug__` flag:\n```python\nif __debug__:\n from nanoset import NanoSet as set\nelse:\n from nanoset import PicoSet as set\n```\nThis will cause `PicoSet` to be used instead of `NanoSet` when running Python\nwith the `-O` flag.\n\n\n### \ud83d\udcc8 Statistics\n\nOkay, so let's do some maths. With `S = 232` the size of an allocated set,\n`s` the size of the wrapper (`56` for `NanoSet`, `24` for `PicoSet`), the\n`x` percentage of nonempty sets in our data structure, the relative size\nof our sets is:\n\n * if we're using `set`: **S \\* x / (S \\* x) = 100%** (we use that as a reference)\n * if we're using `nanoset`: **((S + s) \\* x + s \\* (100 - x)) / (S \\* x)**\n\nThis gives us the following graph, which shows how much memory you can save\ndepending of the ratio of empty sets you have at runtime:\n\n![sizegraph](https://github.com/althonos/nanoset.py/raw/master/static/sizegraph.svg?sanitize=true)\n\nIf we get back to our NCBITaxon example, we have a total of **1,595,237** nodes\nand **1,130,671** leaves, which means that by using sets we are allocating\n**1,595,237 * 232 = 353.0 MiB** of memory simply for `set` after the whole\ntaxonomy is loaded. If we use `NanoSet` however, we\ncan reduce this to **188.0 MiB**, or even to **139.3 MiB** with `PicoSet`!\n**We just saved about 50% memory just by using `NanoSet` in place of `set`.**\n\n\n## \ud83d\udd27 Installing\n\nThis module is implemented in Rust, but native [Python wheels](https://pythonwheels.com/)\nare compiled for the following platforms:\n\n* Windows x86-64: CPython 3.5, 3.6, 3.7\n* Linux x86-64: CPython 3.5, 3.6, 3.7\n* OSX x86-64: CPython 3.6, 3.7\n\nIf you platform is not among these, you will need a\n[working Rust `nightly` toolchain](https://www.rust-lang.org/tools/install)\nas well as the [`setuptools-rust`](https://pypi.org/project/setuptools-rust/)\nlibrary installed to build the extension module.\n\nThen, simply install with `pip`:\n```console\n$ pip install --user nanoset\n```\n\n## \ud83d\udcd6 API Reference\n\nWell, this is a comprehensive wrapper for `set`, so you can just read the\n[standard library documentation](https://docs.python.org/3.7/library/stdtypes.html#set-types-set-frozenset).\nExcept for some very particular edge-cases, `NanoSet` and `PicoSet` both pass the\n[`set` test suite](https://github.com/python/cpython/blob/master/Lib/test/test_set.py)\nof [CPython](https://github.com/python/cpython).\n\nThere are however things you *can't* do:\n- Subclassing a `PicoSet` or a `NanoSet`.\n- Weakrefing a `PicoSet` or a `NanoSet`.\n- Checking for membership in a plain `set` or `frozenset` with implicit\n conversion to `frozenset`.\n- Creating a `dict` from a `PicoSet` or a `NanoSet` without rehashing keys.\n\n## \ud83d\udcdc License\n\nThis library is provided under the open-source [MIT license](https://choosealicense.com/licenses/mit/).\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/althonos/nanoset.py", "keywords": "Python,set,memory,wrapper,optimisation", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "nanoset", "package_url": "https://pypi.org/project/nanoset/", "platform": "any", "project_url": "https://pypi.org/project/nanoset/", "project_urls": { "Homepage": "https://github.com/althonos/nanoset.py" }, "release_url": "https://pypi.org/project/nanoset/0.1.2/", "requires_dist": null, "requires_python": ">= 3.5.*", "summary": "A memory-optimized wrapper for Python sets likely to be empty.", "version": "0.1.2" }, "last_serial": 5874284, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "d025747a0162b74ef48f1b0dc4fbc71d", "sha256": "4aa5827f5d95bc2dd767e1cfeb79d9b68b6048b34b28b0c7ee425e65bfcaf52f" }, "downloads": -1, "filename": "nanoset-0.1.0-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "d025747a0162b74ef48f1b0dc4fbc71d", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">= 3.5.*", "size": 213867, "upload_time": "2019-09-21T14:54:16", "url": "https://files.pythonhosted.org/packages/35/ed/3de9ca4fae6284c1ceeecbdfc46181e07f541b4db71f5bd6cf1db845419b/nanoset-0.1.0-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "0e4772c48cee65651407b26159364d0b", "sha256": "5c8bef93e002aa6ee6d6f513c70330383fbd6d55f927ac9de1da7ce7b9cdc5bc" }, "downloads": -1, "filename": "nanoset-0.1.0-cp35-cp35m-win_amd64.whl", "has_sig": false, "md5_digest": "0e4772c48cee65651407b26159364d0b", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">= 3.5.*", "size": 684672, "upload_time": "2019-09-21T14:52:00", "url": "https://files.pythonhosted.org/packages/b8/ba/41f08a22afa012e2075ebfb06239bc1fed917df921b075f92cb19407a56e/nanoset-0.1.0-cp35-cp35m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "4417cbfcc0dab46344dedb25a6ca63f6", "sha256": "ff8684f3b1cbbd357fee892231f39b2be20df1f9ae09252c1ba5382124c93db8" }, "downloads": -1, "filename": "nanoset-0.1.0-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "4417cbfcc0dab46344dedb25a6ca63f6", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 213830, "upload_time": "2019-09-21T14:53:59", "url": "https://files.pythonhosted.org/packages/6c/72/4c1f5249f3105c436b40002007b7a00fef80cd11674a1e0847f34c2f3933/nanoset-0.1.0-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "c5bc4b449118934ccff8ec0a2f446aa0", "sha256": "d7e0435b869ffc3398ecaf358a5ac2eb78f65d2d391fd3de52796b7a1bc9d917" }, "downloads": -1, "filename": "nanoset-0.1.0-cp36-cp36m-win_amd64.whl", "has_sig": false, "md5_digest": "c5bc4b449118934ccff8ec0a2f446aa0", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 685867, "upload_time": "2019-09-21T14:55:14", "url": "https://files.pythonhosted.org/packages/1a/9d/393564c9431a41d4ddcaafc4e6bd2f7cc28aa2384340355140d8ee05018c/nanoset-0.1.0-cp36-cp36m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "ca7f116ca5c2c4c4d5a77d0383471df0", "sha256": "274ac2295d18cb9c2e2cee399d136e088119f3c7ece7b1df5e39f46ebe1f622c" }, "downloads": -1, "filename": "nanoset-0.1.0-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "ca7f116ca5c2c4c4d5a77d0383471df0", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 213419, "upload_time": "2019-09-21T14:54:03", "url": "https://files.pythonhosted.org/packages/b6/fe/74c7a7f805330114fc0b2cd842049aa3a860a8e3a8b8b5dfb2b924b50f30/nanoset-0.1.0-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "b0fa0328c3e64c57ca54f8e1285d1926", "sha256": "70b26db557010d10643f43bfb54f7e5ab41cf5181aa7035f4c30cdd0fe1bbb51" }, "downloads": -1, "filename": "nanoset-0.1.0-cp37-cp37m-win_amd64.whl", "has_sig": false, "md5_digest": "b0fa0328c3e64c57ca54f8e1285d1926", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 685390, "upload_time": "2019-09-21T14:58:25", "url": "https://files.pythonhosted.org/packages/b8/ce/fbcc7c9bd16a01b86348afb8fb1e15c69bbe78dae239dde3ed932d23e00a/nanoset-0.1.0-cp37-cp37m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "15b06474131c678a94ef220109dbedc5", "sha256": "bb8b250e63a1e38c167e0a270346a9954e707cf55f1092295c3158753f70cac9" }, "downloads": -1, "filename": "nanoset-0.1.0.tar.gz", "has_sig": false, "md5_digest": "15b06474131c678a94ef220109dbedc5", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.5.*", "size": 38786, "upload_time": "2019-09-21T14:54:01", "url": "https://files.pythonhosted.org/packages/2b/2a/607ad460b78ed5596b194176f2856394df2227538d47a68937d98622b4cf/nanoset-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "d715aeaaa8b1f4176c25a5d8dc5e5dda", "sha256": "660a00be9b0bdf6d6e77405a5718f83ee892d13d67f1df39d97df25c19e59c71" }, "downloads": -1, "filename": "nanoset-0.1.1-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "d715aeaaa8b1f4176c25a5d8dc5e5dda", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">= 3.5.*", "size": 213838, "upload_time": "2019-09-22T08:29:52", "url": "https://files.pythonhosted.org/packages/02/83/ae61d8f4b7c795d937d81e2d44cc7a500093b87962ace1baa7f3245f78f9/nanoset-0.1.1-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "6b85d3a95397093375f9a05a44e26b39", "sha256": "caa830b3d63db2b2a62cbb6c7f5f3a1637c42987e1025548f6a620cc9037dd55" }, "downloads": -1, "filename": "nanoset-0.1.1-cp35-cp35m-win_amd64.whl", "has_sig": false, "md5_digest": "6b85d3a95397093375f9a05a44e26b39", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">= 3.5.*", "size": 685855, "upload_time": "2019-09-22T08:32:35", "url": "https://files.pythonhosted.org/packages/b4/60/b8624c28b0ca61ab92c8b3b91da08b88f7ff2d88f651b5db9f9056d7a7e9/nanoset-0.1.1-cp35-cp35m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "f9209be88cb4852bd644fab70dbf8fa6", "sha256": "09bb0ecaf8b8edf39b2f444011d3d1e1976cde840b0b80602e8f15b74d7679b2" }, "downloads": -1, "filename": "nanoset-0.1.1-cp36-cp36m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "f9209be88cb4852bd644fab70dbf8fa6", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 181076, "upload_time": "2019-09-22T08:40:27", "url": "https://files.pythonhosted.org/packages/75/77/0c05c1749c984273bd52b9804b0998dc165bbef820a332236731a672dcf2/nanoset-0.1.1-cp36-cp36m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "8113992c76310ee9afd5d5e84681b313", "sha256": "3f9dc00104c4f336c806e7fa14b4d1b6fa19fe9d84ce6bd91ef0284c86738962" }, "downloads": -1, "filename": "nanoset-0.1.1-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "8113992c76310ee9afd5d5e84681b313", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 213855, "upload_time": "2019-09-22T08:29:38", "url": "https://files.pythonhosted.org/packages/67/2f/1a6e1d1ea6272d88bd7d6476d14394d1a5e3592a5ceb2c4b46cfcc42a232/nanoset-0.1.1-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "955b0b54723f6955dda57c0a0c5e7e99", "sha256": "f521eff4a0c904bd31d6954106b924dc9395cfe625f85e65049db81db85728b4" }, "downloads": -1, "filename": "nanoset-0.1.1-cp36-cp36m-win_amd64.whl", "has_sig": false, "md5_digest": "955b0b54723f6955dda57c0a0c5e7e99", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 683121, "upload_time": "2019-09-22T08:40:00", "url": "https://files.pythonhosted.org/packages/5c/88/9696740f77b2324d7c87500b7a886e4dc0f63df16ffc52173a354e6ef169/nanoset-0.1.1-cp36-cp36m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "6f3845f7229c75e16e04cfb3c7c8bc79", "sha256": "d60f0b06a2e4ef3ad0e67bc3ef5d85775a5b8020ce74461aa09e6e8b7aff2787" }, "downloads": -1, "filename": "nanoset-0.1.1-cp37-cp37m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "6f3845f7229c75e16e04cfb3c7c8bc79", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 181736, "upload_time": "2019-09-22T08:47:29", "url": "https://files.pythonhosted.org/packages/f9/9f/50a9d45c0b5e8bac70effa40f5ae659fc62a25a1579f3b82fb635321b1de/nanoset-0.1.1-cp37-cp37m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "cb693dc220e6307e6fc0eb63cd13eb0b", "sha256": "1c71fb3d30b02371709813eb99cf9175d6d9f10ec836cb6f137402763bf7afc0" }, "downloads": -1, "filename": "nanoset-0.1.1-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "cb693dc220e6307e6fc0eb63cd13eb0b", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 213532, "upload_time": "2019-09-22T08:30:05", "url": "https://files.pythonhosted.org/packages/e3/ed/4e156f3d330a13c8dcb9ea378e2dcc58ab5f73b153b931f0c14ce6e640e9/nanoset-0.1.1-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "9f2cd472916050fea88e061ddba60638", "sha256": "129b2c3690bb1bddd44b2f73ea78557383eebb50fae7e0d35bf57fbeb406168e" }, "downloads": -1, "filename": "nanoset-0.1.1-cp37-cp37m-win_amd64.whl", "has_sig": false, "md5_digest": "9f2cd472916050fea88e061ddba60638", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 685545, "upload_time": "2019-09-22T08:47:17", "url": "https://files.pythonhosted.org/packages/19/bc/86be76e9bc4ba6b36c65b6e69c0a94876349c6f131a3130601e91e528912/nanoset-0.1.1-cp37-cp37m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "dc85e6e4984e0ea81e62256291180035", "sha256": "c544fc8d20c6b4a72e3ac84f27182a0648b71b7133a4b5c5c3b882defda02a4b" }, "downloads": -1, "filename": "nanoset-0.1.1.tar.gz", "has_sig": false, "md5_digest": "dc85e6e4984e0ea81e62256291180035", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.5.*", "size": 39275, "upload_time": "2019-09-22T08:29:39", "url": "https://files.pythonhosted.org/packages/21/64/668c23fad1a7951a61d1b9d151830ff188620430f97eb7121425c3ca9f6a/nanoset-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "0c9a24c05132bc302dae34b713714a54", "sha256": "12d899f0354b5537c20c0c133b3bc75747405c91b6e5e4fc0a8960b947cbb12b" }, "downloads": -1, "filename": "nanoset-0.1.2-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "0c9a24c05132bc302dae34b713714a54", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">= 3.5.*", "size": 214222, "upload_time": "2019-09-23T15:06:34", "url": "https://files.pythonhosted.org/packages/50/c3/abee716b84029f09bf6776afdfbf03b9d195fafbc1363ba5b72882843c5f/nanoset-0.1.2-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "03eafcec95d396ccf99f2d9d905ff47f", "sha256": "8236615662486d5236afa71160ac941bbf497971a1806dd5386d40957f401777" }, "downloads": -1, "filename": "nanoset-0.1.2-cp35-cp35m-win_amd64.whl", "has_sig": false, "md5_digest": "03eafcec95d396ccf99f2d9d905ff47f", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">= 3.5.*", "size": 685869, "upload_time": "2019-09-23T15:04:12", "url": "https://files.pythonhosted.org/packages/14/31/978538163920f2046fe6eeeee5db408f60aa1981d1677a469720b5d0b274/nanoset-0.1.2-cp35-cp35m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "4d9b3324ea3314490f14755bebf4caf0", "sha256": "36c20a7fe4dc062602f2f9b3abc3adfc035d97ad000a821c1f66c166b98057ea" }, "downloads": -1, "filename": "nanoset-0.1.2-cp36-cp36m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "4d9b3324ea3314490f14755bebf4caf0", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 181344, "upload_time": "2019-09-23T15:16:38", "url": "https://files.pythonhosted.org/packages/20/6c/b1fc91b2e58e28a5fbe2b00a0ff83a9fa527046d6b07fc1bb4dd5fcfa55a/nanoset-0.1.2-cp36-cp36m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "56a83c3d74a98f0c32136c0dd1978171", "sha256": "3c6af2f1a1f4ddb63abe6a76dd7659dbf6e17d4be57e975bafef8b6b3366a8a1" }, "downloads": -1, "filename": "nanoset-0.1.2-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "56a83c3d74a98f0c32136c0dd1978171", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 214269, "upload_time": "2019-09-23T15:06:19", "url": "https://files.pythonhosted.org/packages/41/18/b7591bae3c7524b6bf4e0c5547e515eb84032da537f1f6be9562171594fb/nanoset-0.1.2-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "4ca82c1c03af944f104a9e64b1e6e250", "sha256": "9b24ab67c724592d6fc20908c88e7f7c6f900ceaad7e5844346df79fb553a6ee" }, "downloads": -1, "filename": "nanoset-0.1.2-cp36-cp36m-win_amd64.whl", "has_sig": false, "md5_digest": "4ca82c1c03af944f104a9e64b1e6e250", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 685622, "upload_time": "2019-09-23T15:07:16", "url": "https://files.pythonhosted.org/packages/e4/1b/51801eeb2b596b8e8943893fa1b6b5ae1b43c9f9e5f7b78a8d4846c6fbbc/nanoset-0.1.2-cp36-cp36m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "cd4ca1c7e801c2ae28f59b3a19aa6f68", "sha256": "78b5db5558905b383f882d77584751fb80f9a301d5bc6b43dd49b3e932323d38" }, "downloads": -1, "filename": "nanoset-0.1.2-cp37-cp37m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "cd4ca1c7e801c2ae28f59b3a19aa6f68", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 182041, "upload_time": "2019-09-23T15:20:14", "url": "https://files.pythonhosted.org/packages/eb/2b/cb31de85455814994f246482f7d1108ce9fe7a1730c77b0ea0c35162f852/nanoset-0.1.2-cp37-cp37m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "6625b676e8dff420a1327e79edb35212", "sha256": "d140be33fbe7331cedf5789093b65b9ef9a09236777b6c919944d847c5a2a097" }, "downloads": -1, "filename": "nanoset-0.1.2-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "6625b676e8dff420a1327e79edb35212", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 213959, "upload_time": "2019-09-23T15:06:21", "url": "https://files.pythonhosted.org/packages/bd/bd/807d6fe96401e08d2235b3585330cfa942aa798d27b2b97ebdbe671d5863/nanoset-0.1.2-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "2356d395557ed93ffbcb6ad894af3d3b", "sha256": "dd0090fd51280986bed04529984f3f3aa249de429f647a47facbe2cdcfab54d7" }, "downloads": -1, "filename": "nanoset-0.1.2-cp37-cp37m-win_amd64.whl", "has_sig": false, "md5_digest": "2356d395557ed93ffbcb6ad894af3d3b", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 685746, "upload_time": "2019-09-23T15:10:43", "url": "https://files.pythonhosted.org/packages/b1/09/9ab169a6ef1fd42ad71c6d7394affccc53601c187c95c78747f3bd3c59be/nanoset-0.1.2-cp37-cp37m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "76d07381df203ed3b609dd147a395918", "sha256": "a31b82a18ed33c116eb1e573c1fc5b9ffc9cd55ebe7618e1f66891fa8993bdad" }, "downloads": -1, "filename": "nanoset-0.1.2.tar.gz", "has_sig": false, "md5_digest": "76d07381df203ed3b609dd147a395918", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.5.*", "size": 39612, "upload_time": "2019-09-23T15:06:21", "url": "https://files.pythonhosted.org/packages/66/99/adaf669bb4fe4dc34d53c2f9bec0ed00769b7295633fdb260ef0332f808d/nanoset-0.1.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0c9a24c05132bc302dae34b713714a54", "sha256": "12d899f0354b5537c20c0c133b3bc75747405c91b6e5e4fc0a8960b947cbb12b" }, "downloads": -1, "filename": "nanoset-0.1.2-cp35-cp35m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "0c9a24c05132bc302dae34b713714a54", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">= 3.5.*", "size": 214222, "upload_time": "2019-09-23T15:06:34", "url": "https://files.pythonhosted.org/packages/50/c3/abee716b84029f09bf6776afdfbf03b9d195fafbc1363ba5b72882843c5f/nanoset-0.1.2-cp35-cp35m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "03eafcec95d396ccf99f2d9d905ff47f", "sha256": "8236615662486d5236afa71160ac941bbf497971a1806dd5386d40957f401777" }, "downloads": -1, "filename": "nanoset-0.1.2-cp35-cp35m-win_amd64.whl", "has_sig": false, "md5_digest": "03eafcec95d396ccf99f2d9d905ff47f", "packagetype": "bdist_wheel", "python_version": "cp35", "requires_python": ">= 3.5.*", "size": 685869, "upload_time": "2019-09-23T15:04:12", "url": "https://files.pythonhosted.org/packages/14/31/978538163920f2046fe6eeeee5db408f60aa1981d1677a469720b5d0b274/nanoset-0.1.2-cp35-cp35m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "4d9b3324ea3314490f14755bebf4caf0", "sha256": "36c20a7fe4dc062602f2f9b3abc3adfc035d97ad000a821c1f66c166b98057ea" }, "downloads": -1, "filename": "nanoset-0.1.2-cp36-cp36m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "4d9b3324ea3314490f14755bebf4caf0", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 181344, "upload_time": "2019-09-23T15:16:38", "url": "https://files.pythonhosted.org/packages/20/6c/b1fc91b2e58e28a5fbe2b00a0ff83a9fa527046d6b07fc1bb4dd5fcfa55a/nanoset-0.1.2-cp36-cp36m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "56a83c3d74a98f0c32136c0dd1978171", "sha256": "3c6af2f1a1f4ddb63abe6a76dd7659dbf6e17d4be57e975bafef8b6b3366a8a1" }, "downloads": -1, "filename": "nanoset-0.1.2-cp36-cp36m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "56a83c3d74a98f0c32136c0dd1978171", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 214269, "upload_time": "2019-09-23T15:06:19", "url": "https://files.pythonhosted.org/packages/41/18/b7591bae3c7524b6bf4e0c5547e515eb84032da537f1f6be9562171594fb/nanoset-0.1.2-cp36-cp36m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "4ca82c1c03af944f104a9e64b1e6e250", "sha256": "9b24ab67c724592d6fc20908c88e7f7c6f900ceaad7e5844346df79fb553a6ee" }, "downloads": -1, "filename": "nanoset-0.1.2-cp36-cp36m-win_amd64.whl", "has_sig": false, "md5_digest": "4ca82c1c03af944f104a9e64b1e6e250", "packagetype": "bdist_wheel", "python_version": "cp36", "requires_python": ">= 3.5.*", "size": 685622, "upload_time": "2019-09-23T15:07:16", "url": "https://files.pythonhosted.org/packages/e4/1b/51801eeb2b596b8e8943893fa1b6b5ae1b43c9f9e5f7b78a8d4846c6fbbc/nanoset-0.1.2-cp36-cp36m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "cd4ca1c7e801c2ae28f59b3a19aa6f68", "sha256": "78b5db5558905b383f882d77584751fb80f9a301d5bc6b43dd49b3e932323d38" }, "downloads": -1, "filename": "nanoset-0.1.2-cp37-cp37m-macosx_10_13_x86_64.whl", "has_sig": false, "md5_digest": "cd4ca1c7e801c2ae28f59b3a19aa6f68", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 182041, "upload_time": "2019-09-23T15:20:14", "url": "https://files.pythonhosted.org/packages/eb/2b/cb31de85455814994f246482f7d1108ce9fe7a1730c77b0ea0c35162f852/nanoset-0.1.2-cp37-cp37m-macosx_10_13_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "6625b676e8dff420a1327e79edb35212", "sha256": "d140be33fbe7331cedf5789093b65b9ef9a09236777b6c919944d847c5a2a097" }, "downloads": -1, "filename": "nanoset-0.1.2-cp37-cp37m-manylinux1_x86_64.whl", "has_sig": false, "md5_digest": "6625b676e8dff420a1327e79edb35212", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 213959, "upload_time": "2019-09-23T15:06:21", "url": "https://files.pythonhosted.org/packages/bd/bd/807d6fe96401e08d2235b3585330cfa942aa798d27b2b97ebdbe671d5863/nanoset-0.1.2-cp37-cp37m-manylinux1_x86_64.whl" }, { "comment_text": "", "digests": { "md5": "2356d395557ed93ffbcb6ad894af3d3b", "sha256": "dd0090fd51280986bed04529984f3f3aa249de429f647a47facbe2cdcfab54d7" }, "downloads": -1, "filename": "nanoset-0.1.2-cp37-cp37m-win_amd64.whl", "has_sig": false, "md5_digest": "2356d395557ed93ffbcb6ad894af3d3b", "packagetype": "bdist_wheel", "python_version": "cp37", "requires_python": ">= 3.5.*", "size": 685746, "upload_time": "2019-09-23T15:10:43", "url": "https://files.pythonhosted.org/packages/b1/09/9ab169a6ef1fd42ad71c6d7394affccc53601c187c95c78747f3bd3c59be/nanoset-0.1.2-cp37-cp37m-win_amd64.whl" }, { "comment_text": "", "digests": { "md5": "76d07381df203ed3b609dd147a395918", "sha256": "a31b82a18ed33c116eb1e573c1fc5b9ffc9cd55ebe7618e1f66891fa8993bdad" }, "downloads": -1, "filename": "nanoset-0.1.2.tar.gz", "has_sig": false, "md5_digest": "76d07381df203ed3b609dd147a395918", "packagetype": "sdist", "python_version": "source", "requires_python": ">= 3.5.*", "size": 39612, "upload_time": "2019-09-23T15:06:21", "url": "https://files.pythonhosted.org/packages/66/99/adaf669bb4fe4dc34d53c2f9bec0ed00769b7295633fdb260ef0332f808d/nanoset-0.1.2.tar.gz" } ] }