{ "info": { "author": "Rohit Singh", "author_email": "singhrohit2@hotmail.com", "bugtrack_url": null, "classifiers": [ "Programming Language :: Python :: 3" ], "description": "# iterlib\n\nA library for easy iterator-based concurrency and parallelism.\n\n| Build Status |\n|--------------|\n|[![CircleCI](https://circleci.com/gh/rohits2/iterlib.svg?style=svg)](https://circleci.com/gh/rohits2/iterlib)|\n\n## What is this?\n\nHave you ever been working with `map` or a generator and gotten annoyed with how slow lazy evaluation made some tasks?\nHave you ever wondered \"could I run this generator in the background?\"\n\nThis library exists as the answer to that question.\nIt implements asynchronous preloading generators and parallel `map`.\nBoth the preloaders and the parallel `map` implementations support `multiprocessing` and `threading` as backends.\n\n## How do I use it?\n### Preload\nHere's a simple example of preloading a generator:\n\n```python3\nfrom iterlib import thread_preload\n\ngen = (x**2 for x in range(100000))\npreloaded_gen = thread_preload(gen, buffer_size=100)\n```\n\nThat's it! The generator will now preload up to 100 items in the background. When you call `next(preloaded_gen)`, either directly or indirectly through a `for` statement, it will return values from the preloaded queue.\n\n### Parallel Map\nPreloading generators has a significant limitation: it's impossible to use more than one background executor because access to iterators requires synchronization. However, most generators tend to be `map`s over other iterators, which opens an opportunity. We can't parallelize reads from an iterator, but we can parallelize function calls.\n\nUse one of `threaded_map` or `process_map` when you know your generator is a map:\n\n```python3\nfrom iterlib import thread_map\n\ngen = [x for x in range(100000)]\nmapped_gen = thread_map(lambda x: x**2, buffer_size=100, num_workers=4)\n```\n\nThis will create an `ItemizedMap` named `mapped_gen`. When you call `iter(mapped_gen)`, a generator will be created in the background that will preload up to 100 samples per worker (so 400 total in this example).\n\n> **Careful**: These functions has different semantics than the regular Python `map`! If you `map` over an indexable collection (like a list or numpy array) the returned `ItemizedMap` will also be an indexable collection that lazily evaluates the `map` for each element you access! Only when `iter` is called (in a for loop or directly) will it return an asynchronous generator.\n\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/rohits2/iterlib", "keywords": "iterators,generators,threading,multiprocessing,map", "license": "BSD", "maintainer": "", "maintainer_email": "", "name": "iterlib", "package_url": "https://pypi.org/project/iterlib/", "platform": "", "project_url": "https://pypi.org/project/iterlib/", "project_urls": { "Homepage": "https://github.com/rohits2/iterlib" }, "release_url": "https://pypi.org/project/iterlib/1.1.6/", "requires_dist": [ "loguru", "check-manifest ; extra == 'dev'", "coveralls ; extra == 'test'", "pytest-cov ; extra == 'test'", "pydocstyle ; extra == 'test'", "pytest-timeout ; extra == 'test'" ], "requires_python": "", "summary": "Parallel and concurrent iterators", "version": "1.1.6" }, "last_serial": 5632434, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "6191cf00bc22f7f31201a3804bb6b646", "sha256": "e1675c1b4c26459539434546734a55b437a13240ee36a2cb1baa366d0a49d673" }, "downloads": -1, "filename": "iterlib-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6191cf00bc22f7f31201a3804bb6b646", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4258, "upload_time": "2019-07-27T21:07:16", "url": "https://files.pythonhosted.org/packages/d7/28/e794bd6e74108fcd35f9fc68a5f6577f92d3370796e46a089aae5ea533bc/iterlib-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c6d7ffc552b414a13f78a4adfa2140f8", "sha256": "ead8d94c19bd7d5c0f61b9626c967c4f657d27e2cf5c6343aba18d5d72f5de2a" }, "downloads": -1, "filename": "iterlib-1.0.0.tar.gz", "has_sig": false, "md5_digest": "c6d7ffc552b414a13f78a4adfa2140f8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 2817, "upload_time": "2019-07-27T21:07:18", "url": "https://files.pythonhosted.org/packages/67/7c/ab4cf1642975cc542cc05bf294d6cb981ef45977600e63c66363d9e3ef58/iterlib-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "527e16df9ea9bf2512467efbbf10a40f", "sha256": "f11c8bd98c51e411d0c34a33659aa8f97835693fed29f97687ad1df76f518a44" }, "downloads": -1, "filename": "iterlib-1.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "527e16df9ea9bf2512467efbbf10a40f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4484, "upload_time": "2019-07-29T04:28:37", "url": "https://files.pythonhosted.org/packages/5d/e7/9f77077fba49d6eb2528be684b05c20b584540cdd37c3d379f1faf3ddc6d/iterlib-1.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "37a917501fbdb917d551d068479f663c", "sha256": "f43c0d1f5f2e1d74e1fa8d7b586a48bde11b26c67676b282fbbf135f0bff0ae9" }, "downloads": -1, "filename": "iterlib-1.1.0.tar.gz", "has_sig": false, "md5_digest": "37a917501fbdb917d551d068479f663c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3030, "upload_time": "2019-07-29T04:28:39", "url": "https://files.pythonhosted.org/packages/35/d4/fb9753aee9ff46ccf8d4e268dc813b25e079f895d63cf3fda549e65cc2bb/iterlib-1.1.0.tar.gz" } ], "1.1.1": [ { "comment_text": "", "digests": { "md5": "9c3864b8bc5c5400ac3a71a645452e40", "sha256": "266bce3b2cd06f7afd808bebbcaacacf6744ba8fe9c8b1c71c19d669dfd872d3" }, "downloads": -1, "filename": "iterlib-1.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9c3864b8bc5c5400ac3a71a645452e40", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4489, "upload_time": "2019-07-29T04:35:18", "url": "https://files.pythonhosted.org/packages/04/b6/7f0ecdccb26f2682f73792d34d0b602a69a345dc0379b44a0192ed2daa1f/iterlib-1.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "dc495c97abdd638e2611ac675930a654", "sha256": "e230be47f81c83246d1b25268a55ca1e02cadcd025544e6b090b5156ba99b26b" }, "downloads": -1, "filename": "iterlib-1.1.1.tar.gz", "has_sig": false, "md5_digest": "dc495c97abdd638e2611ac675930a654", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3029, "upload_time": "2019-07-29T04:35:21", "url": "https://files.pythonhosted.org/packages/86/f6/f55b9e71baf7879b053a5bdfe1e55220881118a27b6ee1875325a441ea34/iterlib-1.1.1.tar.gz" } ], "1.1.2": [ { "comment_text": "", "digests": { "md5": "0a1e90835e1ca545c087ab13c51a007a", "sha256": "0987699d13d3d97faf04d7ebbb714725c96dc91b758872a2de188fe12857b0ca" }, "downloads": -1, "filename": "iterlib-1.1.2-py3-none-any.whl", "has_sig": false, "md5_digest": "0a1e90835e1ca545c087ab13c51a007a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 4675, "upload_time": "2019-07-30T04:25:57", "url": "https://files.pythonhosted.org/packages/95/28/2741cca7990ff6d59f1984384f1addad3a9b3e07d6161bd023f0882b7f82/iterlib-1.1.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "83df1dcfbd4f83593db37361b84d98a2", "sha256": "32982cd84281d671d732a25d976165dbe41d3b2deb07e564d8393cc1f9a28621" }, "downloads": -1, "filename": "iterlib-1.1.2.tar.gz", "has_sig": false, "md5_digest": "83df1dcfbd4f83593db37361b84d98a2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3160, "upload_time": "2019-07-30T04:26:00", "url": "https://files.pythonhosted.org/packages/89/5b/f70a95eb38e8cf30dc24a2d9a8ad4cc2ebd9b42b360bfafb4fc98968f6b4/iterlib-1.1.2.tar.gz" } ], "1.1.3": [ { "comment_text": "", "digests": { "md5": "97ffb1ea92d3d46108de16f0932f7609", "sha256": "fdfd503de77f7e2ad2dc2fe5d16a24aae4d6c46ee9867edd4b63c766224fce81" }, "downloads": -1, "filename": "iterlib-1.1.3-py3-none-any.whl", "has_sig": false, "md5_digest": "97ffb1ea92d3d46108de16f0932f7609", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5589, "upload_time": "2019-07-30T04:38:36", "url": "https://files.pythonhosted.org/packages/6e/e9/cb46c7506a6cf4531f58c78a9d8997cacdc7f25c2ad227d9c48562bfb3cf/iterlib-1.1.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "fa72fa51e1c42962816d5a81a90ff19f", "sha256": "bfccfc559232a111f443166011943ee4c0b3e90ca3046b23186bd1e751fa3e2e" }, "downloads": -1, "filename": "iterlib-1.1.3.tar.gz", "has_sig": false, "md5_digest": "fa72fa51e1c42962816d5a81a90ff19f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3959, "upload_time": "2019-07-30T04:38:37", "url": "https://files.pythonhosted.org/packages/cc/a3/0033bea96cbd6372aabfcf1bf1561c1b29d601db1cb28e682bbe58fd6232/iterlib-1.1.3.tar.gz" } ], "1.1.4": [ { "comment_text": "", "digests": { "md5": "a807c50e0a4c74e011c7691884e3eb26", "sha256": "5309610e040a5241b00fa43172d068fafba616418b88aa0624b3784648cfdd5d" }, "downloads": -1, "filename": "iterlib-1.1.4-py3-none-any.whl", "has_sig": false, "md5_digest": "a807c50e0a4c74e011c7691884e3eb26", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6697, "upload_time": "2019-07-30T20:08:10", "url": "https://files.pythonhosted.org/packages/57/b6/19a65780e022ab6d9ef1323bfbd8ba78665ccd64bcb21e401b63b21fad9f/iterlib-1.1.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "77c13841551f9d593ce0c05de39dd161", "sha256": "e72f3ee3fb2a4ae087afb2c89c64d61e73b5083e279995d2ba5d410faba5095e" }, "downloads": -1, "filename": "iterlib-1.1.4.tar.gz", "has_sig": false, "md5_digest": "77c13841551f9d593ce0c05de39dd161", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5099, "upload_time": "2019-07-30T20:08:11", "url": "https://files.pythonhosted.org/packages/cf/4a/1f9f89d30d73e72cb9ac64655b53d73289219aba038ebd80e56b77e15e24/iterlib-1.1.4.tar.gz" } ], "1.1.5": [ { "comment_text": "", "digests": { "md5": "9af2d983cfae848882d064d80e7a4900", "sha256": "d3b7928f2a78a0279d3f76919e6aed05772fffeb72f6684d31a594c53eda554c" }, "downloads": -1, "filename": "iterlib-1.1.5-py3-none-any.whl", "has_sig": false, "md5_digest": "9af2d983cfae848882d064d80e7a4900", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 7623, "upload_time": "2019-07-31T05:21:36", "url": "https://files.pythonhosted.org/packages/c7/1a/9f3a66f35ccb7e62021eac3bcbd5cfade74077c97bbd4cbde95ef7cc0be5/iterlib-1.1.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "faa1651007116c0f7d775a77cac9ce2b", "sha256": "3e5e471997abcf27b399384c8a5b050b8170a2a5ace6621698ffd5c8c64f2ff5" }, "downloads": -1, "filename": "iterlib-1.1.5.tar.gz", "has_sig": false, "md5_digest": "faa1651007116c0f7d775a77cac9ce2b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5913, "upload_time": "2019-07-31T05:21:38", "url": "https://files.pythonhosted.org/packages/fb/b0/b4b026f7e09b8083f646f565d7bc8e0d64dd1a7cd29dd9d3f118d83dbf15/iterlib-1.1.5.tar.gz" } ], "1.1.6": [ { "comment_text": "", "digests": { "md5": "ffd0bcaca53a02a9a1dbb2238f9a980b", "sha256": "26a515972a8e16578b92bc5d8d058e122b740138da4be2e28222d97f81d2d617" }, "downloads": -1, "filename": "iterlib-1.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "ffd0bcaca53a02a9a1dbb2238f9a980b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8247, "upload_time": "2019-08-05T03:53:55", "url": "https://files.pythonhosted.org/packages/d5/9b/0be2df11da154a218b63590125e85bbb8283cc55708a9801af9409011cd5/iterlib-1.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a12167c343123dacb69f91dd1e0d6c1a", "sha256": "b6809624118651911367fdd2dc78927bb328396e0bbe06405b989aa064b942b7" }, "downloads": -1, "filename": "iterlib-1.1.6.tar.gz", "has_sig": false, "md5_digest": "a12167c343123dacb69f91dd1e0d6c1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6309, "upload_time": "2019-08-05T03:53:57", "url": "https://files.pythonhosted.org/packages/a8/7b/698f91c993683dd2b0676f7bc3677caad386cf56a0255fb774245dae5e53/iterlib-1.1.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "ffd0bcaca53a02a9a1dbb2238f9a980b", "sha256": "26a515972a8e16578b92bc5d8d058e122b740138da4be2e28222d97f81d2d617" }, "downloads": -1, "filename": "iterlib-1.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "ffd0bcaca53a02a9a1dbb2238f9a980b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 8247, "upload_time": "2019-08-05T03:53:55", "url": "https://files.pythonhosted.org/packages/d5/9b/0be2df11da154a218b63590125e85bbb8283cc55708a9801af9409011cd5/iterlib-1.1.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a12167c343123dacb69f91dd1e0d6c1a", "sha256": "b6809624118651911367fdd2dc78927bb328396e0bbe06405b989aa064b942b7" }, "downloads": -1, "filename": "iterlib-1.1.6.tar.gz", "has_sig": false, "md5_digest": "a12167c343123dacb69f91dd1e0d6c1a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6309, "upload_time": "2019-08-05T03:53:57", "url": "https://files.pythonhosted.org/packages/a8/7b/698f91c993683dd2b0676f7bc3677caad386cf56a0255fb774245dae5e53/iterlib-1.1.6.tar.gz" } ] }