bool-hybrid-array 9.11.0__py3-none-any.whl → 9.11.2__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.
- bool_hybrid_array/__init__.py +1 -1
- bool_hybrid_array/__main__.py +3 -1
- bool_hybrid_array/core.py +18 -4
- bool_hybrid_array/int_array/__init__.py +8 -53
- {bool_hybrid_array-9.11.0.dist-info → bool_hybrid_array-9.11.2.dist-info}/METADATA +15 -3
- bool_hybrid_array-9.11.2.dist-info/RECORD +10 -0
- bool_hybrid_array-9.11.0.dist-info/RECORD +0 -10
- {bool_hybrid_array-9.11.0.dist-info → bool_hybrid_array-9.11.2.dist-info}/WHEEL +0 -0
- {bool_hybrid_array-9.11.0.dist-info → bool_hybrid_array-9.11.2.dist-info}/licenses/LICENSE +0 -0
- {bool_hybrid_array-9.11.0.dist-info → bool_hybrid_array-9.11.2.dist-info}/top_level.txt +0 -0
bool_hybrid_array/__init__.py
CHANGED
bool_hybrid_array/__main__.py
CHANGED
|
@@ -274,10 +274,12 @@ max_num = (1 << 256) - 1
|
|
|
274
274
|
min_num = -max_num
|
|
275
275
|
|
|
276
276
|
# 1. IntHybridArray:257位完美存储
|
|
277
|
-
arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
|
|
277
|
+
arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456, 1], bit_length=257)
|
|
278
278
|
print("✅ IntHybridArray存储结果:")
|
|
279
279
|
print(f"最大值:{arr_hybrid[0]}")
|
|
280
280
|
print(f"最小值:{arr_hybrid[1]}")
|
|
281
|
+
print(f"整个数组:{arr_hybrid}")
|
|
282
|
+
|
|
281
283
|
|
|
282
284
|
# 2. NumPy:用最大的int64尝试存储(必然失败)
|
|
283
285
|
try:
|
bool_hybrid_array/core.py
CHANGED
|
@@ -241,7 +241,7 @@ class BoolHybridArray(MutableSequence,Exception,metaclass=ResurrectMeta):
|
|
|
241
241
|
if pos < len(self.large):
|
|
242
242
|
del self.large[pos]
|
|
243
243
|
return None
|
|
244
|
-
def __getitem__(self, key:int|slice) -> BoolHybridArray:
|
|
244
|
+
def __getitem__(self, key:int|slice = -1) -> BoolHybridArray:
|
|
245
245
|
if isinstance(key, slice):
|
|
246
246
|
start, stop, step = key.indices(self.size)
|
|
247
247
|
return BoolHybridArr((self[i] for i in range(start, stop, step)),hash_ = self.hash_)
|
|
@@ -284,7 +284,7 @@ class BoolHybridArray(MutableSequence,Exception,metaclass=ResurrectMeta):
|
|
|
284
284
|
def __repr__(self) -> str:
|
|
285
285
|
return(f"BoolHybridArray(split_index={self.split_index}, size={self.size}, "
|
|
286
286
|
+f"is_sparse={self.is_sparse}, small_len={len(self.small)}, large_len={len(self.large)})")
|
|
287
|
-
def __delitem__(self, key: int) -> None:
|
|
287
|
+
def __delitem__(self, key: int = -1) -> None:
|
|
288
288
|
key = key if key >= 0 else key + self.size
|
|
289
289
|
if not (0 <= key < self.size):
|
|
290
290
|
raise IndexError(f"索引 {key} 超出范围 [0, {self.size})")
|
|
@@ -445,6 +445,12 @@ class BoolHybridArray(MutableSequence,Exception,metaclass=ResurrectMeta):
|
|
|
445
445
|
def append(self,v):
|
|
446
446
|
self.size += 1
|
|
447
447
|
self[-1] = v
|
|
448
|
+
push = append
|
|
449
|
+
peek = __getitem__
|
|
450
|
+
top = property(peek)
|
|
451
|
+
front = property(lambda self:self[0])
|
|
452
|
+
rear = top
|
|
453
|
+
enqueue = push
|
|
448
454
|
def index(self, value) -> int:
|
|
449
455
|
if self.size == 0:
|
|
450
456
|
raise ValueError('无法在空的 BoolHybridArray 中查找元素!')
|
|
@@ -524,6 +530,7 @@ class BoolHybridArray(MutableSequence,Exception,metaclass=ResurrectMeta):
|
|
|
524
530
|
return arr
|
|
525
531
|
def __reduce__(self):
|
|
526
532
|
return BoolHybridArr,(np.asarray(self),self.is_sparse,self.Type,self.hash_,),
|
|
533
|
+
dequeue = lambda self:self.pop(0)
|
|
527
534
|
class BoolHybridArr(BoolHybridArray,metaclass=ResurrectMeta):
|
|
528
535
|
__module__ = 'bool_hybrid_array'
|
|
529
536
|
def __new__(cls, lst: Iterable, is_sparse=None, Type = None, hash_ = True) -> BoolHybridArray:
|
|
@@ -702,6 +709,9 @@ class BHA_List(list,metaclass=ResurrectMeta):
|
|
|
702
709
|
"对比numpy节省": f"{(1 - total / (temp + 96)) * 100:.6f}%"}
|
|
703
710
|
def __iter__(self):
|
|
704
711
|
return BHA_Iterator(super().__iter__())
|
|
712
|
+
def to_ascii_art(self, width=20):
|
|
713
|
+
art = '\n'.join([' '.join(['■' if j else ' ' for j in i]) for i in self])
|
|
714
|
+
return art
|
|
705
715
|
class BHA_Iterator(Iterator,metaclass=ResurrectMeta):
|
|
706
716
|
__module__ = 'bool_hybrid_array'
|
|
707
717
|
def __init__(self,data):
|
|
@@ -738,7 +748,9 @@ class ProtectedBuiltinsDict(dict,metaclass=ResurrectMeta):
|
|
|
738
748
|
self.name = name
|
|
739
749
|
super().__setattr__("protected_names",protected_names)
|
|
740
750
|
def __setitem__(self, name, value):
|
|
741
|
-
if not hasattr(self,"protected_names"):
|
|
751
|
+
if not hasattr(self,"protected_names"):
|
|
752
|
+
super().__setitem__(name, value)
|
|
753
|
+
return
|
|
742
754
|
try:
|
|
743
755
|
if name in ["T", "F"]:
|
|
744
756
|
current_T = self.get("T")
|
|
@@ -751,7 +763,9 @@ class ProtectedBuiltinsDict(dict,metaclass=ResurrectMeta):
|
|
|
751
763
|
if name in self.protected_names and name not in ["T", "F"]:
|
|
752
764
|
print(f"警告:禁止修改内置常量 __{self.name}__['{name}']!")
|
|
753
765
|
raise AttributeError(f"禁止修改内置常量 __{self.name}__['{name}']")
|
|
754
|
-
except:
|
|
766
|
+
except:
|
|
767
|
+
if sys.implementation.name == 'cpython':
|
|
768
|
+
raise
|
|
755
769
|
finally:super().__setitem__(name, value)
|
|
756
770
|
def __delitem__(self, name):
|
|
757
771
|
if name in self.protected_names:
|
|
@@ -95,58 +95,9 @@ class IntHybridArray(BoolHybridArray):
|
|
|
95
95
|
return self.to_int(bit_chunk)
|
|
96
96
|
|
|
97
97
|
def __setitem__(self, key, value):
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
values = list(value) if isinstance(value, (list, tuple, IntHybridArray)) else [value] * ((stop - start + step - 1) // step)
|
|
102
|
-
idx = 0
|
|
103
|
-
for int_idx in range(start, stop, step):
|
|
104
|
-
block_start = int_idx * self.bit_length
|
|
105
|
-
block_end = block_start + self.bit_length
|
|
106
|
-
if block_end > self.size:
|
|
107
|
-
raise IndexError("索引超出范围")
|
|
108
|
-
num = values[idx % len(values)]
|
|
109
|
-
if num >= 0:
|
|
110
|
-
sign_bit = False
|
|
111
|
-
num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
|
|
112
|
-
else:
|
|
113
|
-
sign_bit = True
|
|
114
|
-
abs_num = abs(num)
|
|
115
|
-
num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
|
|
116
|
-
carry = 1
|
|
117
|
-
for j in range(len(num_bits)):
|
|
118
|
-
if carry:
|
|
119
|
-
num_bits[j] = not num_bits[j]
|
|
120
|
-
carry = 0 if num_bits[j] else 1
|
|
121
|
-
bool_data = [sign_bit] + num_bits
|
|
122
|
-
for bit_idx in range(self.bit_length):
|
|
123
|
-
super().__setitem__(block_start + bit_idx, bool_data[bit_idx])
|
|
124
|
-
idx += 1
|
|
125
|
-
return
|
|
126
|
-
key = key if key >= 0 else key + len(self)
|
|
127
|
-
if not (0 <= key < len(self)):
|
|
128
|
-
raise IndexError("索引超出范围")
|
|
129
|
-
block_start = key * self.bit_length
|
|
130
|
-
block_end = block_start + self.bit_length
|
|
131
|
-
if block_end > self.size:
|
|
132
|
-
raise IndexError("索引超出范围")
|
|
133
|
-
num = value
|
|
134
|
-
if num >= 0:
|
|
135
|
-
sign_bit = False
|
|
136
|
-
num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
|
|
137
|
-
else:
|
|
138
|
-
sign_bit = True
|
|
139
|
-
abs_num = abs(num)
|
|
140
|
-
num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
|
|
141
|
-
carry = 1
|
|
142
|
-
for j in range(len(num_bits)):
|
|
143
|
-
if carry:
|
|
144
|
-
num_bits[j] = not num_bits[j]
|
|
145
|
-
carry = 0 if num_bits[j] else 1
|
|
146
|
-
bool_data = [sign_bit] + num_bits
|
|
147
|
-
for bit_idx in range(self.bit_length):
|
|
148
|
-
super(self.__class__, self).__setitem__(block_start + bit_idx, bool_data[bit_idx])
|
|
149
|
-
|
|
98
|
+
tmp = lst(self)
|
|
99
|
+
tmp[key] = value
|
|
100
|
+
self.__dict__ = IntHybridArray(tmp)
|
|
150
101
|
def __iter__(self):
|
|
151
102
|
return map(self.__getitem__,range(len(self)))
|
|
152
103
|
|
|
@@ -197,4 +148,8 @@ class IntHybridArray(BoolHybridArray):
|
|
|
197
148
|
self.total_bits += len_*self.bit_length
|
|
198
149
|
for i,j in zip(range(len_),iterable):
|
|
199
150
|
self[-i-1] = j
|
|
200
|
-
|
|
151
|
+
def append(self,value):
|
|
152
|
+
self.total_bits += self.bit_length
|
|
153
|
+
self.size = self.total_bits
|
|
154
|
+
self[-1] = value
|
|
155
|
+
__all__ = tuple(globals())
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bool-hybrid-array
|
|
3
|
-
Version: 9.11.
|
|
3
|
+
Version: 9.11.2
|
|
4
4
|
Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
|
|
5
5
|
Home-page: https://github.com/BKsell/bool-hybrid-array
|
|
6
6
|
Author: 蔡靖杰
|
|
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
21
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
21
22
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
22
23
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -26,6 +27,8 @@ Description-Content-Type: text/markdown
|
|
|
26
27
|
License-File: LICENSE
|
|
27
28
|
Requires-Dist: numpy>=1.19.0
|
|
28
29
|
Provides-Extra: int-array
|
|
30
|
+
Provides-Extra: numba-opt
|
|
31
|
+
Requires-Dist: numba>=0.55.0; extra == "numba-opt"
|
|
29
32
|
Dynamic: author
|
|
30
33
|
Dynamic: author-email
|
|
31
34
|
Dynamic: classifier
|
|
@@ -42,10 +45,17 @@ Dynamic: summary
|
|
|
42
45
|
|
|
43
46
|
# BoolHybridArray:高效的布尔混合数组库
|
|
44
47
|
|
|
48
|
+
<!-- 月下载量(核心推荐)+ 周下载量 + 总下载量 -->
|
|
49
|
+
[](https://pepy.tech/project/bool-hybrid-array)
|
|
50
|
+
[](https://pepy.tech/project/bool-hybrid-array)
|
|
51
|
+
[](https://pepy.tech/project/bool-hybrid-array)
|
|
52
|
+
|
|
45
53
|
一个专为布尔值优化的数组类,能够根据数据特征自动在密集存储和稀疏存储模式间切换,兼顾性能和内存效率。
|
|
46
54
|
|
|
47
55
|
## ***注:大版本号更新并非不兼容更新,而是重大更新***
|
|
48
56
|
|
|
57
|
+
注:当API完全稳定时就会发布版本规则较严谨的new-1.0.0版本,预期为10.x版本结束后
|
|
58
|
+
|
|
49
59
|
***注意:目前社区中若存在名称类似(如包含 “bool-hybrid-array”+ 后缀、boolean\_array、validate.io-boolean-array)的库,均与本项目(bool-hybrid-array)无关联,本项目的所有功能设计、代码实现均为独立开发;***
|
|
50
60
|
***其他平台里的类似名库绝不是我的库***
|
|
51
61
|
|
|
@@ -143,7 +153,7 @@ big_arr = BoolHybridArr([i % 100 == 0 for i in range(10000)])
|
|
|
143
153
|
|
|
144
154
|
# 查看存储模式(此时应为稀疏模式)
|
|
145
155
|
|
|
146
|
-
print(repr(big_arr)) # 输出: BoolHybridArray(split_index=100,size=10000,is_sparse=True,small_len=
|
|
156
|
+
print(repr(big_arr)) # 输出: BoolHybridArray(split_index=100, size=10000, is_sparse=True, small_len=101, large_len=98)
|
|
147
157
|
|
|
148
158
|
# 自动优化存储
|
|
149
159
|
|
|
@@ -574,7 +584,9 @@ except OverflowError as e:
|
|
|
574
584
|
* **9.10.20**:优化性能,增加BHA_jit_log日志
|
|
575
585
|
* **9.10.21**:优化Ask_BHA,移除BHA_jit_log日志
|
|
576
586
|
* **9.10.22**:进一步优化Ask_BHA的性能
|
|
577
|
-
* **9.11.0**:新增对7.3.10
|
|
587
|
+
* **9.11.0**:新增对7.3.10以上版本的PyPy解释器的支持
|
|
588
|
+
* **9.11.1**:修复PyPy解释器下的保护机制过度保护bug
|
|
589
|
+
* **9.11.2**:尝试修复IntHybridArray索引修改的错误
|
|
578
590
|
|
|
579
591
|
|
|
580
592
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
bool_hybrid_array/__init__.py,sha256=e8WknVCXsaVgyryuKtc4uLs4T9A2ofqC-BPUg6sXu9Q,1038
|
|
2
|
+
bool_hybrid_array/__main__.py,sha256=2HbnUEgExGwO6UoM6SIp5DNkx4zH0jWJZBU2eovuAic,8491
|
|
3
|
+
bool_hybrid_array/core.py,sha256=WctTj1uhBxq4mKvUZGtQjECgNzalfMulvNa-uIXc9nc,39530
|
|
4
|
+
bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
|
|
5
|
+
bool_hybrid_array/int_array/__init__.py,sha256=GwRHcOtU6SpVBtLQNrzbhcaZZ2p1PJqb2C0iTEjNBVA,6241
|
|
6
|
+
bool_hybrid_array-9.11.2.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
|
|
7
|
+
bool_hybrid_array-9.11.2.dist-info/METADATA,sha256=xrJCOoDQLiAisNRukO4QZahBRe5UimLlgo1Tw2EcUuU,24858
|
|
8
|
+
bool_hybrid_array-9.11.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
9
|
+
bool_hybrid_array-9.11.2.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
|
|
10
|
+
bool_hybrid_array-9.11.2.dist-info/RECORD,,
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
bool_hybrid_array/__init__.py,sha256=LG4gW4LcOkLDZFgS4fawE2Ztk4cOqm65GXamiHJjLCo,1038
|
|
2
|
-
bool_hybrid_array/__main__.py,sha256=3bnJ2IQctrXWQ1WyBQvh1w882_k3b84LGLL8yUNkXws,8447
|
|
3
|
-
bool_hybrid_array/core.py,sha256=kx023cSTOkN2aK2GJ9E33EQLfZUrXpNEP77eBWRVsRo,39081
|
|
4
|
-
bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
|
|
5
|
-
bool_hybrid_array/int_array/__init__.py,sha256=1TN2O461-Mso4yZ6YFkhHcdNxgPPQYBJ0PzkWdkpFC8,8478
|
|
6
|
-
bool_hybrid_array-9.11.0.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
|
|
7
|
-
bool_hybrid_array-9.11.0.dist-info/METADATA,sha256=NZ05bIUnF0ql-pkT1NwF30l9LXhUpKTepi0p2cc69Dc,24081
|
|
8
|
-
bool_hybrid_array-9.11.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
9
|
-
bool_hybrid_array-9.11.0.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
|
|
10
|
-
bool_hybrid_array-9.11.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|