bool-hybrid-array 9.10.10__py3-none-any.whl → 9.10.21__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.
@@ -1,12 +1,12 @@
1
- from .bool_hybrid_array import *
1
+ from __future__ import annotations
2
+ from ..core import *
2
3
  import builtins
3
4
 
4
-
5
- class IntBitTag(BHA_Bool, metaclass=ResurrectMeta):
5
+ class IntBitTag(BHA_bool, metaclass=ResurrectMeta):
6
6
  def __str__(self):
7
7
  return "'-1'" if (hasattr(self, 'is_sign_bit') and self.is_sign_bit and self) else "'1'" if self else "'0'"
8
8
  __repr__ = __str__
9
-
9
+ __del__ = lambda self:self
10
10
  class IntHybridArray(BoolHybridArray):
11
11
  def __init__(self, int_array: list[int], bit_length: int = 8):
12
12
  self.bit_length = bit_length
@@ -37,13 +37,17 @@ class IntHybridArray(BoolHybridArray):
37
37
  carry = 0 if num_bits[j] else 1
38
38
  bool_data.append(sign_bit)
39
39
  bool_data.extend(num_bits)
40
- temp_arr = BoolHybridArr(bool_data, Type=IntBitTag)
41
- super().__init__(temp_arr.split_index, temp_arr.size, temp_arr.is_sparse, temp_arr.Type, False)
42
- for idx in range(temp_arr.size):
43
- self[idx] = temp_arr[idx].value
44
- for i in range(0, self.size, self.bit_length):
40
+ self.total_bits = len(bool_data)
41
+ super().__init__(0, self.total_bits, False, IntBitTag, False)
42
+ for idx in range(self.total_bits):
43
+ if idx < self.size:
44
+ super().__setitem__(idx, bool_data[idx])
45
+ else:
46
+ super().append(bool_data[idx])
47
+ for i in range(0, self.total_bits, self.bit_length):
45
48
  if i < self.size:
46
- self[i].is_sign_bit = True
49
+ bit_tag = super().__getitem__(i)
50
+ bit_tag.is_sign_bit = True
47
51
 
48
52
  def to_int(self, bit_chunk):
49
53
  sign_bit = bit_chunk[0].value
@@ -72,21 +76,22 @@ class IntHybridArray(BoolHybridArray):
72
76
  start, stop, step = key.indices(len(self))
73
77
  result = []
74
78
  for i in range(start, stop, step):
75
- block_idx = i // self.bit_length
76
- bit_idx_in_block = i % self.bit_length
77
- block_start = block_idx * self.bit_length
79
+ block_start = i * self.bit_length
78
80
  block_end = block_start + self.bit_length
79
- bit_chunk = [self[j] for j in range(block_start, block_end)]
81
+ if block_end > self.size:
82
+ raise IndexError("索引超出范围")
83
+ bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
80
84
  num = self.to_int(bit_chunk)
81
85
  result.append(num)
82
86
  return IntHybridArray(result, self.bit_length)
83
87
  key = key if key >= 0 else key + len(self)
84
88
  if not (0 <= key < len(self)):
85
89
  raise IndexError("索引超出范围")
86
- block_idx = key // self.bit_length
87
- block_start = block_idx * self.bit_length
90
+ block_start = key * self.bit_length
88
91
  block_end = block_start + self.bit_length
89
- bit_chunk = [self[j] for j in range(block_start, block_end)]
92
+ if block_end > self.size:
93
+ raise IndexError("索引超出范围")
94
+ bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
90
95
  return self.to_int(bit_chunk)
91
96
 
92
97
  def __setitem__(self, key, value):
@@ -95,16 +100,36 @@ class IntHybridArray(BoolHybridArray):
95
100
  start, stop, step = key.indices(len(self))
96
101
  values = list(value) if isinstance(value, (list, tuple, IntHybridArray)) else [value] * ((stop - start + step - 1) // step)
97
102
  idx = 0
98
- for i in range(start, stop, step):
99
- self[i] = values[idx % len(values)]
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])
100
124
  idx += 1
101
125
  return
102
126
  key = key if key >= 0 else key + len(self)
103
127
  if not (0 <= key < len(self)):
104
128
  raise IndexError("索引超出范围")
105
- block_idx = key // self.bit_length
106
- block_start = block_idx * self.bit_length
107
- bool_data = []
129
+ block_start = key * self.bit_length
130
+ block_end = block_start + self.bit_length
131
+ if block_end > self.size:
132
+ raise IndexError("索引超出范围")
108
133
  num = value
109
134
  if num >= 0:
110
135
  sign_bit = False
@@ -118,28 +143,61 @@ class IntHybridArray(BoolHybridArray):
118
143
  if carry:
119
144
  num_bits[j] = not num_bits[j]
120
145
  carry = 0 if num_bits[j] else 1
121
- bool_data.append(sign_bit)
122
- bool_data.extend(num_bits)
123
- for idx in range(self.bit_length):
124
- self[block_start + idx] = bool_data[idx]
146
+ bool_data = [sign_bit] + num_bits
147
+ for bit_idx in range(self.bit_length):
148
+ super().__setitem__(block_start + bit_idx, bool_data[bit_idx])
125
149
 
126
150
  def __iter__(self):
127
- for i in range(0, self.size, self.bit_length):
128
- bit_chunk = [self[j] for j in range(i, i + self.bit_length)]
151
+ for i in range(0, self.total_bits, self.bit_length):
152
+ if i + self.bit_length > self.size:
153
+ break
154
+ bit_chunk = [super().__getitem__(j) for j in range(i, i + self.bit_length)]
129
155
  yield self.to_int(bit_chunk)
130
156
 
131
157
  def __str__(self):
132
158
  return f"IntHybridArray([{', '.join(map(str, self))}])"
159
+ __repr__ = __str__
133
160
 
134
161
  def __len__(self):
135
- return self.size // self.bit_length
136
- builtins.IntHybridArray = IntHybridArray
137
- if __name__ == "__main__":
138
- test = [0, 10, -5, 31, 32768, -65536]
139
- arr = IntHybridArray(test)
140
- print(arr)
141
- print(arr[2])
142
- arr[3] = -100
143
- print(arr)
144
- print(list(arr))
145
- print(arr[1:4])
162
+ return self.total_bits // self.bit_length
163
+ def __delitem__(self, index: int = -1):
164
+ index = index if index >= 0 else index + len(self)
165
+ if not (0 <= index < len(self)):
166
+ raise IndexError("删除索引超出范围")
167
+ target_num = self[index]
168
+ pop_bit_start = index * self.bit_length
169
+ pop_bit_end = pop_bit_start + self.bit_length
170
+ for _ in range(self.bit_length):
171
+ super().__delitem__(pop_bit_start)
172
+ self.total_bits -= self.bit_length
173
+ def index(self, value):
174
+ value = int(value)
175
+ x = f"{value} 不在 IntHybridArray 中"
176
+ for idx in range(len(self)+2>>2):
177
+ if self[idx] == value:
178
+ return idx
179
+ elif self[-idx] == value:
180
+ x = len(self)-idx
181
+ if x != f"{value} 不在 IntHybridArray 中":
182
+ return x
183
+ raise ValueError(x)
184
+ def rindex(self, value):
185
+ value = int(value)
186
+ x = f"{value} 不在 IntHybridArray 中"
187
+ for idx in range(len(self)+2>>2):
188
+ if self[-idx] == value:
189
+ return -idx
190
+ elif self[idx] == value:
191
+ x = -(len(self)-idx)
192
+ if x != f"{value} 不在 IntHybridArray 中":
193
+ return x
194
+ raise ValueError(x)
195
+ def extend(self, iterable:Iterable) -> None:
196
+ if isinstance(iterable, (Iterator, Generator, map)):
197
+ iterable,copy = itertools.tee(iterable, 2)
198
+ len_ = sum(1 for _ in copy)
199
+ else:
200
+ len_ = len(iterable)
201
+ self.total_bits += len_*self.bit_length
202
+ for i,j in zip(range(len_),iterable):
203
+ self[-i-1] = j
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bool-hybrid-array
3
- Version: 9.10.10
3
+ Version: 9.10.21
4
4
  Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
5
5
  Home-page: https://github.com/BKsell/bool-hybrid-array
6
6
  Author: 蔡靖杰
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Classifier: License :: OSI Approved :: MIT License
20
21
  Classifier: Operating System :: OS Independent
21
22
  Requires-Python: >=3.8
@@ -394,7 +395,21 @@ except:print("请先安装numba库!!!")
394
395
 
395
396
  #int_array模块(9.10.10新增):
396
397
 
397
- arr = int_array.IntHybridArray([100,-27623,18276,-32165])
398
+ max_num = (1 << 256) - 1
399
+ min_num = -max_num
400
+
401
+ # 1. IntHybridArray:257位完美存储
402
+ arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
403
+ print("✅ IntHybridArray存储结果:")
404
+ print(f"最大值:{arr_hybrid[0]}")
405
+ print(f"最小值:{arr_hybrid[1]}")
406
+
407
+ # 2. NumPy:用最大的int64尝试存储(必然失败)
408
+ try:
409
+ arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
410
+ print("\n❌ NumPy存储结果:", arr_np)
411
+ except OverflowError as e:
412
+ print(f"\n❌ NumPy存储失败:{e}")
398
413
 
399
414
  ```
400
415
 
@@ -409,7 +424,7 @@ arr = int_array.IntHybridArray([100,-27623,18276,-32165])
409
424
 
410
425
  ## 版本历史
411
426
 
412
- * **7.8.13**:PyPI上的初始版本,支持基本功能和自动存储优化
427
+ - **7.8.13**:PyPI上的初始版本,支持基本功能和自动存储优化
413
428
  * **7.9.0**:添加TruesArray和FalsesArray
414
429
  * **7.9.1**:修复介绍的bug,增加copy功能
415
430
  * **7.9.2**:新增find()方法
@@ -451,7 +466,7 @@ arr = int_array.IntHybridArray([100,-27623,18276,-32165])
451
466
  * **7.14.4**:修复in的错误×3
452
467
  * **7.14.5**:修复in的错误×4
453
468
  * **7.14.6**:优化arr.large的类型
454
- * **8.0.0**:兼容numpy数组
469
+ - **8.0.0**:兼容numpy数组
455
470
  * **8.0.1**:修复8.0.0兼容numpy数组时没有形状参数的问题
456
471
  * **8.0.2**:移除bool_hybrid_dtype,改用object
457
472
  * **8.1.0**:利用ctypes加速密集部分的一些方法
@@ -463,7 +478,7 @@ arr = int_array.IntHybridArray([100,-27623,18276,-32165])
463
478
  * **8.2.0**:支持哈希
464
479
  * **8.2.1**:修复8.2.0版本中的NameError
465
480
  * **8.2.2**:修复8.2.1版本中的IndexError
466
- * **9.0.0**:详情见上
481
+ - --9.0.0--:详情见上
467
482
  * **9.0.1**:小更新,优化optimize方法
468
483
  * **9.1.0**:新增二维数组的optimize与memory\_usage,优化二维数组的位运算,给BHA\_Bool新增__rand__、**ror**、__rxor__等等
469
484
  * **9.1.1**:修复9.1.0版本中的TypeError: unsupported operand type(s) for +: 'int' and 'method'错误
@@ -541,9 +556,21 @@ arr = int_array.IntHybridArray([100,-27623,18276,-32165])
541
556
  * **9.10.8**:给Create_BHA新增了mmap优化
542
557
  * **9.10.9**:修复9.10.8版本中的NameError错误
543
558
  * **9.10.10**:新增int_array模块
544
-
545
-
546
-
559
+ * **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
560
+ * **9.10.12**:把find方法的返回值改为IntHybridArray
561
+ * **9.10.13**:给IntHybridArray新增多种列表操作
562
+ * **9.10.14**:修复IntHybridArray中因单个 0 导致所有数字位长被压缩到 1的问题
563
+ * **9.10.15**:修复IntHybridArray变成布尔数组的错误
564
+ * **9.10.16**:新增Python 3.14时的jit优化加速
565
+ * **9.10.17**:给保护字典添加__import__方法,支持from导入
566
+ * **9.10.18**:新增BoolHybridArray的序列化和反序列化支持
567
+ * **9.10.18.post1**:修复TypeError: cannot pickle 'itertools._tee' object错误
568
+ * **9.10.18.post2**:尝试修复“满屏错误”的问题
569
+ * **9.10.18.post3**:尝试修复“满屏错误”的问题×2
570
+ * **9.10.18.post4**:尝试修复“满屏错误”的问题×3
571
+ * **9.10.19**:和9.10.18.post4相同,正式版本发布
572
+ * **9.10.20**:优化性能,增加BHA_jit_log日志
573
+ * **9.10.21**:优化Ask_BHA,移除BHA_jit_log日志
547
574
 
548
575
 
549
576
  ## **彩蛋:**
@@ -0,0 +1,10 @@
1
+ bool_hybrid_array/__init__.py,sha256=r04Lq3_vRUkxPYT4oLIz8wLBhbRP70UvXGQKMpt8tps,955
2
+ bool_hybrid_array/__main__.py,sha256=3MsUAXMj6Pe1EzP7YreuUePbXZeQvFSCnejnTeS42kU,8324
3
+ bool_hybrid_array/core.py,sha256=MNxYpZdtY36ElBbdqYjNUp1fJwYEHSTsc1Y323Cytro,37984
4
+ bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
5
+ bool_hybrid_array/int_array/__init__.py,sha256=acjFchFu3k9CQndDbvKfSIyfMMAbgprz8Skf1a4_dKY,8578
6
+ bool_hybrid_array-9.10.21.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
7
+ bool_hybrid_array-9.10.21.dist-info/METADATA,sha256=k037Kzz3zMnTbD-zaIfSacesqeVIThAW2Eu6_AlEiXk,23491
8
+ bool_hybrid_array-9.10.21.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
+ bool_hybrid_array-9.10.21.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
10
+ bool_hybrid_array-9.10.21.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- bool_hybrid_array/__init__.py,sha256=Ge5xU9hWokXo6_tOEychWsFtuCSM2ttCbTXIAVpAsBc,757
2
- bool_hybrid_array/__main__.py,sha256=pE9jECC2i2_13HJnI3qPav1YaggfUs-gdScabvRpD9I,7728
3
- bool_hybrid_array/core.py,sha256=zcqPqb6AhUFqzb0PPXQtisXpXc2Zd50Xsh8ooOvpwO0,36526
4
- bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
5
- bool_hybrid_array/int_array/__init__.py,sha256=S1bG3kmeRqNkAbChCudxP_zAWBVbMJwvOKi39kYt-Rw,5766
6
- bool_hybrid_array-9.10.10.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
7
- bool_hybrid_array-9.10.10.dist-info/METADATA,sha256=5v3IJIUYsCVkXhjgzWDsS_8H4T8XZF9L0c6z96X4Y6M,21905
8
- bool_hybrid_array-9.10.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
- bool_hybrid_array-9.10.10.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
10
- bool_hybrid_array-9.10.10.dist-info/RECORD,,