bigarraylist 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,139 @@
1
+ """量级判定 + 分块大小(简化版,去掉 ScaleValue 多层包装)。
2
+
3
+ 向后兼容:保留 ScaleHelper / ScaleValue / chunk_wise_processing /
4
+ choose_chunk_size / choose_external_sort_chunk_size 全部公开符号,
5
+ 调用方零改动。内部只是把冗余的 ScaleValue 包装换成 int 常量。
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from collections.abc import Iterable, Iterator
11
+ from typing import Final, TypeVar
12
+
13
+ T = TypeVar("T")
14
+
15
+ # ==================== 量级档位常量(int,去掉 ScaleValue 包装) ====================
16
+ HUNDRED_THOUSAND: Final[int] = 100_000
17
+ MILLION: Final[int] = 1_000_000
18
+ TEN_MILLION: Final[int] = 10_000_000
19
+ HUNDRED_MILLION: Final[int] = 100_000_000
20
+
21
+ # 数据量 → 分块大小 映射表(每个 chunk 100~1000 条)
22
+ # 数据量越大,分块越大:减少块数、摊薄调度开销;但不超过 1000,保证单块内存可控
23
+ _CHUNK_SIZE_MAP: dict[int, int] = {
24
+ HUNDRED_THOUSAND: 100,
25
+ MILLION: 300,
26
+ TEN_MILLION: 800,
27
+ HUNDRED_MILLION: 1_000,
28
+ }
29
+
30
+
31
+ class ScaleValue:
32
+ """纯数据载体:保存一个数据量级的数值。
33
+
34
+ 向后兼容保留——重构前公开 API 之一,外部代码可能直接 import 使用。
35
+ 重构后已不再被内部使用,仅作为对外符号保留。
36
+ """
37
+
38
+ def __init__(self, value: int) -> None:
39
+ self._value: Final[int] = value
40
+
41
+ @property
42
+ def value(self) -> int:
43
+ return self._value
44
+
45
+ def __repr__(self) -> str:
46
+ return f"ScaleValue({self._value})"
47
+
48
+ def __eq__(self, other: object) -> bool:
49
+ return isinstance(other, ScaleValue) and self._value == other._value
50
+
51
+ def __hash__(self) -> int:
52
+ return hash(self._value)
53
+
54
+
55
+ class ScaleHelper:
56
+ """数据量级助手。
57
+
58
+ 向后兼容保留——重构前公开 API 之一。内部不再使用本类,
59
+ 所有阈值改走 BigArrayConfig + 直接 int 常量。本类仅薄包装。
60
+ """
61
+
62
+ HUNDRED_THOUSAND = ScaleValue(HUNDRED_THOUSAND)
63
+ MILLION = ScaleValue(MILLION)
64
+ TEN_MILLION = ScaleValue(TEN_MILLION)
65
+ HUNDRED_MILLION = ScaleValue(HUNDRED_MILLION)
66
+
67
+ def __init__(self, value: int) -> None:
68
+ self.value = value
69
+
70
+ @staticmethod
71
+ def get_scale(total_count: int) -> ScaleValue:
72
+ """根据总条数返回对应量级对象。"""
73
+ if total_count >= HUNDRED_MILLION:
74
+ return ScaleHelper.HUNDRED_MILLION
75
+ if total_count >= TEN_MILLION:
76
+ return ScaleHelper.TEN_MILLION
77
+ if total_count >= MILLION:
78
+ return ScaleHelper.MILLION
79
+ if total_count >= HUNDRED_THOUSAND:
80
+ return ScaleHelper.HUNDRED_THOUSAND
81
+ raise ValueError(f"数据量 {total_count},小于十万级阈值 {HUNDRED_THOUSAND}")
82
+
83
+ def __str__(self) -> str:
84
+ v = self.value
85
+ if v >= HUNDRED_MILLION:
86
+ tag = "HUNDRED_MILLION"
87
+ elif v >= TEN_MILLION:
88
+ tag = "TEN_MILLION"
89
+ elif v >= MILLION:
90
+ tag = "MILLION"
91
+ elif v >= HUNDRED_THOUSAND:
92
+ tag = "HUNDRED_THOUSAND"
93
+ else:
94
+ raise ValueError(f"数据量 {v},小于十万级阈值 {HUNDRED_THOUSAND}")
95
+ return f"{self.__class__.__name__}({tag})"
96
+
97
+
98
+ def chunk_wise_processing(iterable: Iterable[T]) -> Iterator[list[T]]:
99
+ """按 choose_chunk_size 选择的大小分块产出。
100
+
101
+ 返回:迭代器,每一项是一个 list[T](单块,长度 <= chunk_size)。
102
+ 要求 iterable 有 __len__;没有的请先过 list(...)。
103
+ """
104
+ total = len(iterable) # type: ignore[arg-type]
105
+ chunk_size = choose_chunk_size(total)
106
+
107
+ it = iter(iterable)
108
+ while True:
109
+ chunk: list[T] = []
110
+ for _ in range(chunk_size):
111
+ try:
112
+ chunk.append(next(it))
113
+ except StopIteration:
114
+ break
115
+ if not chunk:
116
+ return
117
+ yield chunk
118
+
119
+
120
+ def choose_chunk_size(total_count: int) -> int:
121
+ """根据总条数选择分块大小(100~1000)。"""
122
+ scale = ScaleHelper.get_scale(total_count)
123
+ return _CHUNK_SIZE_MAP[scale.value]
124
+
125
+
126
+ def choose_external_sort_chunk_size(
127
+ total_count: int,
128
+ *,
129
+ target: int = 32,
130
+ min_chunk: int = 100_000,
131
+ max_chunk: int = 5_000_000,
132
+ ) -> int:
133
+ """外部排序分块大小。
134
+
135
+ 默认参数对齐重构前行为(目标 32 块,单块 100k~5M)。
136
+ 新增 target/min_chunk/max_chunk 形参,支持通过 BigArrayConfig 覆盖。
137
+ """
138
+ chunk_size = total_count // target
139
+ return max(min_chunk, min(max_chunk, chunk_size))
@@ -0,0 +1,171 @@
1
+ """参数校验工具:所有校验在调用时立即执行(参数非法立刻抛错,不等迭代)。
2
+
3
+ 向后兼容:默认仍抛 TypeError / IndexError / ValueError;
4
+ 当 raise_big_array_list_error=True 时改抛自定义异常子类(仍继承对应标准异常)。
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from collections.abc import Iterable
10
+
11
+ from ..exceptions import (
12
+ DataSourceError,
13
+ IndexOutOfRangeError,
14
+ InvalidArgumentError,
15
+ )
16
+
17
+
18
+ def _raise(
19
+ err_cls: type[Exception],
20
+ std_cls: type[Exception],
21
+ msg: str,
22
+ use_custom: bool,
23
+ ) -> None:
24
+ """统一抛错:use_custom=True 走自定义异常(仍继承标准异常),
25
+ False 抛标准异常保持向后兼容。"""
26
+ if use_custom:
27
+ raise err_cls(msg) from None
28
+ raise std_cls(msg) from None
29
+
30
+
31
+ def validate_index(name: str, value: object, length: int, *, use_custom: bool = False) -> None:
32
+ """校验单个索引参数:必须是 int(排除 bool)、范围 [0, length]。"""
33
+ if isinstance(value, bool) or not isinstance(value, int):
34
+ _raise(
35
+ InvalidArgumentError,
36
+ TypeError,
37
+ f"{name} 必须是整数,得到 {type(value).__name__}",
38
+ use_custom,
39
+ )
40
+ elif value < 0 or value > length:
41
+ _raise(
42
+ IndexOutOfRangeError,
43
+ IndexError,
44
+ f"{name}={value} 越界,有效范围 [0, {length}]",
45
+ use_custom,
46
+ )
47
+
48
+
49
+ def validate_range(
50
+ start: int,
51
+ end: int,
52
+ length: int,
53
+ *,
54
+ use_custom: bool = False,
55
+ ) -> None:
56
+ """校验 [start, end) 区间:类型对、0 <= start <= end <= length。"""
57
+ validate_index("start", start, length, use_custom=use_custom)
58
+ validate_index("end", end, length, use_custom=use_custom)
59
+ if start > end:
60
+ _raise(
61
+ InvalidArgumentError,
62
+ ValueError,
63
+ f"start={start} 不能大于 end={end}",
64
+ use_custom,
65
+ )
66
+
67
+
68
+ def validate_max_workers(value: int | None, *, use_custom: bool = False) -> None:
69
+ """校验 max_workers:None 或正整数(排除 bool)。"""
70
+ if value is None:
71
+ return
72
+ if isinstance(value, bool) or not isinstance(value, int):
73
+ _raise(
74
+ InvalidArgumentError,
75
+ TypeError,
76
+ f"max_workers 必须是正整数或 None,得到 {type(value).__name__}",
77
+ use_custom,
78
+ )
79
+ elif value < 1:
80
+ _raise(
81
+ InvalidArgumentError,
82
+ ValueError,
83
+ f"max_workers 必须 >= 1,得到 {value}",
84
+ use_custom,
85
+ )
86
+
87
+
88
+ def validate_num_buckets(value: int | None, *, use_custom: bool = False) -> None:
89
+ """校验 num_buckets:None 或正整数(排除 bool)。"""
90
+ if value is None:
91
+ return
92
+ if isinstance(value, bool) or not isinstance(value, int):
93
+ _raise(
94
+ InvalidArgumentError,
95
+ TypeError,
96
+ f"num_buckets 必须是正整数或 None,得到 {type(value).__name__}",
97
+ use_custom,
98
+ )
99
+ elif value < 1:
100
+ _raise(
101
+ InvalidArgumentError,
102
+ ValueError,
103
+ f"num_buckets 必须 >= 1,得到 {value}",
104
+ use_custom,
105
+ )
106
+
107
+
108
+ def validate_sample_k(value: int, *, use_custom: bool = False) -> None:
109
+ """校验 sample 的 k:正整数(排除 bool)。"""
110
+ if isinstance(value, bool) or not isinstance(value, int):
111
+ _raise(
112
+ InvalidArgumentError,
113
+ TypeError,
114
+ f"k 必须是正整数,得到 {type(value).__name__}",
115
+ use_custom,
116
+ )
117
+ elif value < 1:
118
+ _raise(
119
+ InvalidArgumentError,
120
+ ValueError,
121
+ f"k 必须 >= 1,得到 {value}",
122
+ use_custom,
123
+ )
124
+
125
+
126
+ def validate_slice_arg(name: str, value: int | None, *, use_custom: bool = False) -> None:
127
+ """校验 slice 的 start/stop/step 参数。
128
+
129
+ - 允许 None(表示"不限制")
130
+ - 不允许负数(惰性流无法反向、无法预知总长倒数)
131
+ - bool 排除(语义不该当索引用)
132
+ """
133
+ if value is None:
134
+ return
135
+ if isinstance(value, bool) or not isinstance(value, int):
136
+ _raise(
137
+ InvalidArgumentError,
138
+ TypeError,
139
+ f"{name} 必须是整数或 None,得到 {type(value).__name__}",
140
+ use_custom,
141
+ )
142
+ elif value < 0:
143
+ _raise(
144
+ InvalidArgumentError,
145
+ ValueError,
146
+ f"{name}={value} 不允许为负数(惰性流不支持反向切片)",
147
+ use_custom,
148
+ )
149
+
150
+
151
+ def validate_callable(name: str, value: object, *, use_custom: bool = False) -> None:
152
+ """校验一个参数必须可调用(callable)。None 不视为 callable。"""
153
+ if not callable(value):
154
+ _raise(
155
+ InvalidArgumentError,
156
+ TypeError,
157
+ f"{name} 必须是可调用对象(函数/lambda/可调用类实例),得到 {type(value).__name__}",
158
+ use_custom,
159
+ )
160
+
161
+
162
+ def validate_iterable(name: str, value: object, *, use_custom: bool = False) -> None:
163
+ """校验一个参数必须是可迭代对象(Iterable)。"""
164
+ if isinstance(value, Iterable):
165
+ return
166
+ _raise(
167
+ DataSourceError,
168
+ TypeError,
169
+ f"{name} 必须是可迭代对象(Iterable),得到 {type(value).__name__}",
170
+ use_custom,
171
+ )
@@ -0,0 +1,158 @@
1
+ Metadata-Version: 2.4
2
+ Name: bigarraylist
3
+ Version: 0.2.0
4
+ Summary: 面向大数据量场景的惰性流式列表:惰性迭代 / 并行查找 / 分块排序 / 外部排序 / 蓄水池抽样 / 二级索引
5
+ Author: PyBigArrayListObject
6
+ License-Expression: MIT
7
+ Keywords: big-data,lazy-stream,parallel,external-sort,generator
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Topic :: Software Development :: Libraries
14
+ Requires-Python: >=3.10
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Provides-Extra: dev
18
+ Requires-Dist: pytest>=7.4; extra == "dev"
19
+ Requires-Dist: pytest-cov>=4.1; extra == "dev"
20
+ Requires-Dist: ruff>=0.5; extra == "dev"
21
+ Requires-Dist: mypy>=1.8; extra == "dev"
22
+ Requires-Dist: pre-commit>=3.6; extra == "dev"
23
+ Dynamic: license-file
24
+
25
+ # BigArrayList
26
+
27
+ > 面向大数据量场景的惰性流式列表:惰性迭代 / 并行查找 / 分块排序 / 低内存外部排序 /
28
+ > 持久化分桶 / 蓄水池抽样 / 二级索引 / 链式算子。
29
+
30
+ 零第三方运行时依赖(只用标准库)。核心思想是**惰性流**——数据不一次性物化进内存,
31
+ 算子组合、按需产出,从而在内存可控的前提下处理远超内存的数据量。
32
+
33
+ > 版本:0.2.0(重构为四层包结构 + 链式 API + 低内存外部排序 + 持久化分桶;
34
+ > 旧 API 100% 向后兼容)
35
+
36
+ ## 安装
37
+
38
+ 开发环境(含测试 + 质量工具):
39
+
40
+ ```bash
41
+ pip install -e ".[dev]"
42
+ ```
43
+
44
+ 仅需运行时则零依赖,直接 `import` 即可。
45
+
46
+ ## 快速开始
47
+
48
+ ```python
49
+ from bigarraylist import BigArrayList
50
+
51
+ arr = BigArrayList([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 1])
52
+
53
+ # 1) 惰性排序(生成器,按需产出)
54
+ top3 = list(__import__("itertools").islice(arr.sort(), 3)) # [1, 1, 3]
55
+
56
+ # 2) 线性并行查找(返回 (下标, 值),惰性、可早停)
57
+ for idx, val in arr.find(5):
58
+ print(idx, val) # 4 5 / 8 5 / 10 5
59
+
60
+ # 3) 链式 API(新):.lazy() 进入 LazyChain,每个算子返回新 LazyChain
61
+ result = (arr.lazy()
62
+ .filter(lambda x: x > 2)
63
+ .map(lambda x: x * 10)
64
+ .distinct()
65
+ .slice(0, 5)
66
+ .collect()) # [30, 40, 90, 60, 50]
67
+
68
+ # 4) 持久化分桶(新):建桶一次,多次 find 复用,O(n/N) 每次查询
69
+ with arr.build_buckets() as idx:
70
+ for tgt in [3, 5, 9]:
71
+ hits = list(idx.find(tgt))
72
+ print(tgt, hits)
73
+ ```
74
+
75
+ ## 特性
76
+
77
+ | 能力 | 方法 | 说明 |
78
+ | --- | --- | --- |
79
+ | 惰性迭代 | `__next__` / `cycle` | 标准协议耗尽即停;`.cycle()` 无限循环 |
80
+ | 增删改插 | `append` / `remove` / `replace` / `insert` | 全惰性、不物化 |
81
+ | 线性查找 | `find` | 多进程分块并行,惰性、可早停 |
82
+ | 二分查找 | `binary_search` | 先排序后 bisect,返回排序后下标 |
83
+ | 分桶查找(一次性) | `bucket_find` | 哈希分桶 + 单桶扫描,每次重建桶 |
84
+ | **持久化分桶(新)** | `build_buckets` | 建桶一次返回 `BucketIndex`,多次 `find` 复用 |
85
+ | 蓄水池抽样 | `sample` | O(k) 内存,无需预知总量 |
86
+ | 二级索引 | `build_index` | `dict[key] -> list[下标]`,O(1) 判定 |
87
+ | 统一查找 | `auto_find` | 按数据量自动选线性 / 分桶 |
88
+ | 排序 | `sort` | 三级分流:<10w 直排 / 10w~100w 内存多进程 / ≥100w 外部排序 |
89
+ | 流式算子(裸生成器) | `map`/`filter`/`reduce`/`slice`/`distinct`/`concat`/`chain`/`group_by`/`count_if` | 全惰性、非物化,向后兼容 |
90
+ | **链式算子(新)** | `.lazy()` → `LazyChain` | `.filter().map().distinct().collect()` 链式组合 |
91
+ | **配置对象(新)** | `BigArrayConfig` | 所有阈值可调,外部排序模式 / 桶上限 / 并行阈值 |
92
+ | **自定义异常(新)** | `exceptions` | 继承标准异常,向后兼容;`raise_custom=True` 启用 |
93
+
94
+ ## 项目结构
95
+
96
+ ```
97
+ PyBigArrayListObject/
98
+ ├── bigarraylist/ # 包
99
+ │ ├── __init__.py # 暴露公共 API
100
+ │ ├── _api.py # BigArrayList 用户接口层(参数校验)
101
+ │ ├── config.py # BigArrayConfig(所有阈值可配置)
102
+ │ ├── exceptions.py # 自定义异常层次(继承标准异常)
103
+ │ ├── core/
104
+ │ │ └── base.py # _CoreBase(__slots__+迭代协议+_fresh_iter)
105
+ │ │ # + BaseBigArrayList(组合各 mixin)
106
+ │ ├── operators/ # 算子 mixin 层
107
+ │ │ ├── crud.py # append/remove/replace/insert
108
+ │ │ ├── search.py # find/binary_search/bucket_find/build_buckets
109
+ │ │ ├── sort.py # sort/is_sorted
110
+ │ │ └── stream.py # map/filter/.../count_if + LazyChain
111
+ │ ├── algorithms/ # 算法实现层(可独立调用)
112
+ │ │ ├── parallel.py # 模块级可 pickle 函数(子进程安全)
113
+ │ │ ├── external_sort.py # 低内存外部排序(streaming/block 两种)
114
+ │ │ ├── bucket.py # BucketIndex + build_buckets 持久化分桶
115
+ │ │ └── sample.py # 蓄水池抽样
116
+ │ └── utils/
117
+ │ ├── scale.py # ScaleHelper/choose_chunk_size/...
118
+ │ └── validation.py # 参数校验(标准异常 or 自定义异常切换)
119
+ ├── tests/ # pytest 套件(test_core/test_api/test_scale + conftest)
120
+ ├── docs/ # 架构说明 / API 参考
121
+ ├── examples/ # 使用示例
122
+ ├── pyproject.toml # 项目配置 + ruff/mypy/pytest/coverage
123
+ ├── .pre-commit-config.yaml
124
+ └── README.md
125
+ ```
126
+
127
+ ## 质量工具
128
+
129
+ ```bash
130
+ pytest # 跑测试(46 个)
131
+ ruff check bigarraylist tests # Lint
132
+ ruff format bigarraylist tests # 格式化
133
+ mypy bigarraylist # 静态类型检查(moderate,见 pyproject 注释)
134
+ pytest --cov=bigarraylist # 覆盖率
135
+ pre-commit run --all-files # 提交前检查
136
+ ```
137
+
138
+ ## 设计要点
139
+
140
+ - **`_fresh_iter()`**:所有算子统一通过它拿一份**独立**的局部迭代器,全程操作局部变量,
141
+ 绝不碰 `self.__data`——算子调用零副作用、可重复调用。
142
+ - **三级排序分流**:按数据量选 `sorted()` / 内存多进程分块 / 外部排序,兼顾速度与内存。
143
+ - **低内存外部排序(新)**:默认 streaming 模式——阶段 1 逐条 `pickle.dump` 落盘,
144
+ 阶段 2 每个文件用 lazy 迭代器逐条 `pickle.load`,`heapq.merge` 同时驱动。
145
+ 内存峰值 = O(块数) 文件句柄 + O(块数) 临时元素(≈ 32),**真正符合"外部排序"语义**,
146
+ 能处理远超内存的数据。需要快 3~5 倍但内存放得下时,设
147
+ `BigArrayConfig(external_sort_streaming_merge=False)` 走整块模式。
148
+ - **cooperative multiple inheritance**:`BaseBigArrayList` 多继承 `_CoreBase + CRUDMixin +
149
+ StreamMixin + SortMixin + SearchMixin` 组合各算子;mixin 不声明字段,通过
150
+ `self._fresh_iter()` / `len(self)` / `self._get_config()` 与核心协作,避免 `__slots__`
151
+ 多继承冲突与 name mangling 问题。
152
+ - **不支持随机访问 `[]`**:与惰性流设计冲突;要第 N 个用 `itertools.islice` 流式跳过。
153
+
154
+ 详见 [docs/architecture.md](docs/architecture.md) 与 [docs/api_reference.md](docs/api_reference.md)。
155
+
156
+ ## License
157
+
158
+ MIT
@@ -0,0 +1,24 @@
1
+ bigarraylist/__init__.py,sha256=vFWbpR-42gWGG-DV2JY_4o6tpag5Ih0bEC0rL7DKWwE,2063
2
+ bigarraylist/_api.py,sha256=dFyJHI09RH7BueqgfvB-XKFeE-5SB_EoxgqmuCsoOX4,20038
3
+ bigarraylist/config.py,sha256=LadYURM1ySyh2Jq5hkIeGaOdWo_vOnU-i6DqAuwY_Is,3163
4
+ bigarraylist/exceptions.py,sha256=iVcGWTJd_hpRI8W05Yf1gUL6XzcVDs5AdF5yoHhznQE,1713
5
+ bigarraylist/algorithms/__init__.py,sha256=X4BC419GWVvVh31ExBGUNNu_wGwcui2zj3EciLtsYo0,537
6
+ bigarraylist/algorithms/bucket.py,sha256=JOikFaVPPVbbyAq0rnv7kNBbG7I_HhXW6Xzit4tJDGg,6701
7
+ bigarraylist/algorithms/external_sort.py,sha256=2vhlYhHJVEgVJPqPZ6pnIX5RgRMRc-dzQ81T8d4IR5s,8491
8
+ bigarraylist/algorithms/parallel.py,sha256=fbf44swcYSEyhKT049q0mhhv5vn4qrVoRHLJBSt2tKk,2571
9
+ bigarraylist/algorithms/sample.py,sha256=vD6XlCbWJpg88wG6c4ygCr2bZqEJqPfJ27BWekV5WPk,1699
10
+ bigarraylist/core/__init__.py,sha256=0FRAGry5jGGlevtRxEw5uiMNLnBHgDBxHA0JQsoirN0,141
11
+ bigarraylist/core/base.py,sha256=i-HhvanimUw_u0I12onl2S8Zx92sl6ed61XA2L0OiVA,9836
12
+ bigarraylist/operators/__init__.py,sha256=5eVkoxDe2T6dedf6PyeBzgY_SQbTMn5c4msWwQyuoCI,302
13
+ bigarraylist/operators/crud.py,sha256=g2V1XT14JKFm7mI3ps--PsVswa_zwe69aqhb7GIc26M,3094
14
+ bigarraylist/operators/search.py,sha256=PmmJQw0QCbMh_jBTvxh-Pk8zdBuKl30jRJyvNU8Id7w,8296
15
+ bigarraylist/operators/sort.py,sha256=jr1HNQ9WztF4XbWoQYETGJIGrSqWoNFKlYzIDXrX9zg,8628
16
+ bigarraylist/operators/stream.py,sha256=AheXVF7mgmWIDpx8v53cZQaawGEf6InEOp3UvaTe0HU,13661
17
+ bigarraylist/utils/__init__.py,sha256=LhSS09XW2qEmh4zFVglyHZVtW0_6pcKaLmCMxuiE1ls,932
18
+ bigarraylist/utils/scale.py,sha256=ozrZedlyVYpam0CdsBLRH6POKz_SDwPru6AIKuTE8wg,4540
19
+ bigarraylist/utils/validation.py,sha256=3eRbgnz1PStI0NWB40w4JhdrrbrLoWdfA_26zxNcWzY,5395
20
+ bigarraylist-0.2.0.dist-info/licenses/LICENSE,sha256=2NnL9V_jfGVWPoNFTOlffbBI92nwaTm8lFy0wvo5quw,1077
21
+ bigarraylist-0.2.0.dist-info/METADATA,sha256=3ux7qvfxM7RFM6WJOTHJmcjA1yNAP7zSLuTZlGWBo8Q,7831
22
+ bigarraylist-0.2.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
23
+ bigarraylist-0.2.0.dist-info/top_level.txt,sha256=y-BkL-WF_RaACC5vL1eKE4MkGOPf4KgACElN5hIYreg,13
24
+ bigarraylist-0.2.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 PyBigArrayListObject
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ bigarraylist