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.
@@ -5,7 +5,7 @@ from . import core
5
5
  from .core import __builtins__,builtins
6
6
  try:from . import int_array
7
7
  except:pass
8
- __version__ = "9.11.0"
8
+ __version__ = "9.11.2"
9
9
  public_objects = []
10
10
  for name in dir(core):
11
11
  if not name.startswith("_"):
@@ -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"):super().__setitem__(name, value)
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:pass
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
- value = int(value)
99
- if isinstance(key, slice):
100
- start, stop, step = key.indices(len(self))
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
- __all__ = list(globals())
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.0
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://static.pepy.tech/badge/bool-hybrid-array/month)](https://pepy.tech/project/bool-hybrid-array)
50
+ [![周下载量](https://static.pepy.tech/badge/bool-hybrid-array/week)](https://pepy.tech/project/bool-hybrid-array)
51
+ [![总下载量](https://static.pepy.tech/badge/bool-hybrid-array)](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=100,large_len=)不好意思large_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以上的版本的PyPy解释器的支持
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,,