A Python library providing cacheable iterator wrappers for both synchronous and asynchronous iterators.
Project description
cached-iterators
A Python library providing cacheable iterator wrappers for both synchronous and asynchronous iterators. This allows iterators to be reused multiple times with cached values, reducing the need for recomputations.
Features
- Reusable Iterators: Wrap synchronous and asynchronous iterators to allow them to be iterated multiple times with cached results.
- Lazy Loading: Only fetch and cache results as needed, avoiding unnecessary computations or I/O operations.
- Ease of Use: Simple API with decorators for easy integration.
- Improved Concurrency: Efficiently handle concurrent tasks that need to use the same iterator.
Installation
You can install this package via pip:
python3 -m pip install cached-iterators
Usage
Synchronous Iterator Wrapper
You can use the synchronous iterator wrapper in two ways: by decorating a function that returns an iterator or by directly wrapping an iterator instance.
- Decorating a function:
from cached_iterators import cacheable_iterator
from typing import Iterator
@cacheable_iterator
def generate_numbers() -> Iterator[int]:
for i in range(5):
print(f"Generating {i}")
yield i
# Create a cacheable iterator using the decorated function
cached_iter = generate_numbers()
# First iteration (values will be generated and cached)
print("First iteration:")
for num in cached_iter:
print(num)
# Second iteration (values will be retrieved from cache)
print("Second iteration:")
for num in cached_iter:
print(num)
- Wrapping an existing iterator:
from cached_iterators import CacheableIteratorWrapper
from typing import Iterator
def generate_numbers() -> Iterator[int]:
for i in range(5):
print(f"Generating {i}")
yield i
# Create a cacheable iterator by wrapping an existing iterator instance
iterator = generate_numbers()
cached_iter = CacheableIteratorWrapper(iterator)
# First iteration (values will be generated and cached)
print("First iteration:")
for num in cached_iter:
print(num)
# Second iteration (values will be retrieved from cache)
print("Second iteration:")
for num in cached_iter:
print(num)
Output
First iteration:
Generating 0
0
Generating 1
1
Generating 2
2
Generating 3
3
Generating 4
4
Second iteration:
0
1
2
3
4
Asynchronous Iterator Wrapper
Similarly, the asynchronous iterator wrapper can be used by decorating a function that returns an asynchronous iterator or by directly wrapping an asynchronous iterator instance.
- Decorating a function:
import asyncio
from cached_iterators import cacheable_async_iterator
from typing import AsyncIterator
@cacheable_async_iterator
async def async_generate_numbers() -> AsyncIterator[int]:
for i in range(5):
print(f"Generating {i}")
yield i
await asyncio.sleep(0) # Simulate async work
# Create a cacheable async iterator using the decorated function
cached_iter = async_generate_numbers()
async def main():
# First iteration (values will be generated and cached)
print("First iteration:")
async for num in cached_iter:
print(num)
# Second iteration (values will be retrieved from cache)
print("Second iteration:")
async for num in cached_iter:
print(num)
# Run the example
asyncio.run(main())
- Wrapping an existing iterator:
import asyncio
from cached_iterators import CacheableAsyncIteratorWrapper
from typing import AsyncIterator
async def async_generate_numbers() -> AsyncIterator[int]:
for i in range(5):
print(f"Generating {i}")
yield i
await asyncio.sleep(0) # Simulate async work
# Create a cacheable async iterator by wrapping an existing async iterator instance
iterator = async_generate_numbers()
cached_iter = CacheableAsyncIteratorWrapper(iterator)
async def main():
# First iteration (values will be generated and cached)
print("First iteration:")
async for num in cached_iter:
print(num)
# Second iteration (values will be retrieved from cache)
print("Second iteration:")
async for num in cached_iter:
print(num)
# Run the example
asyncio.run(main())
Output
First iteration:
Generating 0
0
Generating 1
1
Generating 2
2
Generating 3
3
Generating 4
4
Second iteration:
0
1
2
3
4
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cached_iterators-1.0.3.tar.gz.
File metadata
- Download URL: cached_iterators-1.0.3.tar.gz
- Upload date:
- Size: 3.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.11.6 Darwin/24.0.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38e07a8364edeadfdd8c6dfb37b9154d5bf151a41e3dfa294e84a1ce0fdab38c
|
|
| MD5 |
255603e8d614f6665250ce3c0c6e07fe
|
|
| BLAKE2b-256 |
16c29913e76ab6f31ee26bec6954018af8935e9e4a785feb78d8a0d12ab699a2
|
File details
Details for the file cached_iterators-1.0.3-py3-none-any.whl.
File metadata
- Download URL: cached_iterators-1.0.3-py3-none-any.whl
- Upload date:
- Size: 4.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.7.1 CPython/3.11.6 Darwin/24.0.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab9b27cd9a763b8b5d844324692c544bcb1dd0bc7b1656f13db93aed9124c12b
|
|
| MD5 |
16cbd09d6adcdec1fba6a72070f7ec3d
|
|
| BLAKE2b-256 |
fd39a112ec52858686d24d1d5de730a2c2f1969908d2ccf63828295c70792afc
|