bool-hybrid-array 9.10.5__tar.gz → 9.10.15__tar.gz

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,24 +1,38 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bool-hybrid-array
3
- Version: 9.10.5
3
+ Version: 9.10.15
4
4
  Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
5
+ Home-page: https://github.com/BKsell/bool-hybrid-array
5
6
  Author: 蔡靖杰
6
7
  Author-email: 1289270215@qq.com
8
+ Project-URL: GitHub 主站, https://github.com/BKsell/bool-hybrid-array
9
+ Project-URL: GitHub 中文镜像, https://www.github-zh.com/projects/1083175506-bool-hybrid-array
10
+ Project-URL: Issue 反馈(主站), https://github.com/BKsell/bool-hybrid-array/issues
7
11
  Keywords: boolean array,compact storage
8
12
  Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.8
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
9
19
  Classifier: License :: OSI Approved :: MIT License
10
20
  Classifier: Operating System :: OS Independent
11
21
  Requires-Python: >=3.8
12
22
  Description-Content-Type: text/markdown
13
23
  License-File: LICENSE
14
24
  Requires-Dist: numpy>=1.19.0
25
+ Provides-Extra: int-array
15
26
  Dynamic: author
16
27
  Dynamic: author-email
17
28
  Dynamic: classifier
18
29
  Dynamic: description
19
30
  Dynamic: description-content-type
31
+ Dynamic: home-page
20
32
  Dynamic: keywords
21
33
  Dynamic: license-file
34
+ Dynamic: project-url
35
+ Dynamic: provides-extra
22
36
  Dynamic: requires-dist
23
37
  Dynamic: requires-python
24
38
  Dynamic: summary
@@ -378,6 +392,24 @@ BoolHybridArr([False,False,False,False,True,True,False,True,True,False]),
378
392
  try:numba_opt()
379
393
  except:print("请先安装numba库!!!")
380
394
 
395
+ #int_array模块(9.10.10新增):
396
+
397
+ max_num = (1 << 256) - 1
398
+ min_num = -max_num
399
+
400
+ # 1. IntHybridArray:257位完美存储
401
+ arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
402
+ print("✅ IntHybridArray存储结果:")
403
+ print(f"最大值:{arr_hybrid[0]}")
404
+ print(f"最小值:{arr_hybrid[1]}")
405
+
406
+ # 2. NumPy:用最大的int64尝试存储(必然失败)
407
+ try:
408
+ arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
409
+ print("\n❌ NumPy存储结果:", arr_np)
410
+ except OverflowError as e:
411
+ print(f"\n❌ NumPy存储失败:{e}")
412
+
381
413
  ```
382
414
 
383
415
  ## 性能优势
@@ -518,6 +550,18 @@ except:print("请先安装numba库!!!")
518
550
  * **9.10.3**:解决少补前导零的问题
519
551
  * **9.10.4**:新增numba_opt功能
520
552
  * **9.10.5**:新增BHA_Opener工具包
553
+ * **9.10.6**:给Ask_BHA新增了mmap优化
554
+ * **9.10.7**:修复了RecursionError: maximum recursion depth exceeded错误
555
+ * **9.10.8**:给Create_BHA新增了mmap优化
556
+ * **9.10.9**:修复9.10.8版本中的NameError错误
557
+ * **9.10.10**:新增int_array模块
558
+ * **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
559
+ * **9.10.12**:把find方法的返回值改为IntHybridArray
560
+ * **9.10.13**:给IntHybridArray新增多种列表操作
561
+ * **9.10.14**:修复IntHybridArray中因单个 0 导致所有数字位长被压缩到 1的问题
562
+ * **9.10.15**:修复IntHybridArray变成布尔数组的错误
563
+
564
+
521
565
 
522
566
 
523
567
  ## **彩蛋:**
@@ -353,6 +353,24 @@ BoolHybridArr([False,False,False,False,True,True,False,True,True,False]),
353
353
  try:numba_opt()
354
354
  except:print("请先安装numba库!!!")
355
355
 
356
+ #int_array模块(9.10.10新增):
357
+
358
+ max_num = (1 << 256) - 1
359
+ min_num = -max_num
360
+
361
+ # 1. IntHybridArray:257位完美存储
362
+ arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
363
+ print("✅ IntHybridArray存储结果:")
364
+ print(f"最大值:{arr_hybrid[0]}")
365
+ print(f"最小值:{arr_hybrid[1]}")
366
+
367
+ # 2. NumPy:用最大的int64尝试存储(必然失败)
368
+ try:
369
+ arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
370
+ print("\n❌ NumPy存储结果:", arr_np)
371
+ except OverflowError as e:
372
+ print(f"\n❌ NumPy存储失败:{e}")
373
+
356
374
  ```
357
375
 
358
376
  ## 性能优势
@@ -493,6 +511,18 @@ except:print("请先安装numba库!!!")
493
511
  * **9.10.3**:解决少补前导零的问题
494
512
  * **9.10.4**:新增numba_opt功能
495
513
  * **9.10.5**:新增BHA_Opener工具包
514
+ * **9.10.6**:给Ask_BHA新增了mmap优化
515
+ * **9.10.7**:修复了RecursionError: maximum recursion depth exceeded错误
516
+ * **9.10.8**:给Create_BHA新增了mmap优化
517
+ * **9.10.9**:修复9.10.8版本中的NameError错误
518
+ * **9.10.10**:新增int_array模块
519
+ * **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
520
+ * **9.10.12**:把find方法的返回值改为IntHybridArray
521
+ * **9.10.13**:给IntHybridArray新增多种列表操作
522
+ * **9.10.14**:修复IntHybridArray中因单个 0 导致所有数字位长被压缩到 1的问题
523
+ * **9.10.15**:修复IntHybridArray变成布尔数组的错误
524
+
525
+
496
526
 
497
527
 
498
528
  ## **彩蛋:**
@@ -2,20 +2,22 @@ import sys
2
2
  from types import ModuleType
3
3
  from . import core
4
4
  from .core import __builtins__,builtins
5
- __version__ = "9.10.4"
5
+ from . import int_array
6
+ __version__ = "9.10.15"
6
7
  public_objects = []
7
8
  for name in dir(core):
8
9
  if not name.startswith("_"):
9
10
  obj = getattr(core, name)
10
11
  if isinstance(obj, (type, ModuleType)) or callable(obj):
11
12
  public_objects.append(name)
12
- __all__ = public_objects + ["__version__","__builtins__","core","builtins","__dict__"]
13
+ __all__ = public_objects + ["__version__","__builtins__","core","builtins","__dict__","int_array"]
13
14
  globals().update({
14
15
  name: getattr(core, name)
15
16
  for name in public_objects
16
17
  })
17
18
  try:
18
19
  __dict__ = ProtectedBuiltinsDict(globals())
20
+ sys.modules[__name__+'.int_array'] = ProtectedBuiltinsDict(int_array.__dict__)
19
21
  sys.modules[__name__] = ProtectedBuiltinsDict(globals().copy())
20
22
  sys.modules[__name__].name = 'bool_hybrid_array'
21
23
  core.__dict__ = ProtectedBuiltinsDict(core.__dict__)
@@ -264,4 +264,21 @@ try:numba_opt()
264
264
  except:print("请先安装numba库!!!")
265
265
 
266
266
 
267
+ #int_array模块(9.10.10新增):
268
+
269
+ max_num = (1 << 256) - 1
270
+ min_num = -max_num
271
+
272
+ # 1. IntHybridArray:257位完美存储
273
+ arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
274
+ print("✅ IntHybridArray存储结果:")
275
+ print(f"最大值:{arr_hybrid[0]}")
276
+ print(f"最小值:{arr_hybrid[1]}")
277
+
278
+ # 2. NumPy:用最大的int64尝试存储(必然失败)
279
+ try:
280
+ arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
281
+ print("\n❌ NumPy存储结果:", arr_np)
282
+ except OverflowError as e:
283
+ print(f"\n❌ NumPy存储失败:{e}")
267
284
 
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
  import builtins
3
3
  import array,bisect,numpy as np
4
4
  from collections.abc import MutableSequence,Iterable,Generator,Iterator,Sequence
5
- import itertools,copy,sys,math,weakref,random
5
+ import itertools,copy,sys,math,weakref,random,mmap,os
6
6
  from functools import reduce
7
7
  import operator,ctypes,gc,abc,types
8
8
  from functools import lru_cache
@@ -17,6 +17,7 @@ if 'GenericAlias' in types.__dict__:
17
17
  _GenericAlias = types.GenericAlias
18
18
  class ResurrectMeta(abc.ABCMeta,metaclass=abc.ABCMeta):
19
19
  __module__ = 'bool_hybrid_array'
20
+ name = 'ResurrectMeta'
20
21
  def __new__(cls, name, bases, namespace):
21
22
  meta_bases = tuple(type(base) for base in bases)
22
23
  if cls not in meta_bases:
@@ -46,7 +47,7 @@ class ResurrectMeta(abc.ABCMeta,metaclass=abc.ABCMeta):
46
47
  print(f'警告:禁止删除常变量:{cls}!')
47
48
  raise TypeError(f'禁止删除常变量:{cls}')
48
49
  def __hash__(cls):
49
- return hash(str(cls))
50
+ return hash(cls.name+cls.__module__)
50
51
  def __setattr__(cls,name,value):
51
52
  if not hasattr(cls, 'x'):
52
53
  super().__setattr__(name,value)
@@ -271,7 +272,7 @@ class BoolHybridArray(MutableSequence,Exception,metaclass=ResurrectMeta):
271
272
  raise IndexError(f"小索引 {key} 超出small数组范围(长度{len(self.small)})")
272
273
  self.small = np.delete(self.small, key)
273
274
  self.small = np.append(self.small, not self.is_sparse)
274
- self.split_index = min(self.split_index, len(self.small) - 1)
275
+ self.split_index -= min(self.split_index, len(self.small) - 1)
275
276
  else:
276
277
  pos = bisect.bisect_left(self.large, key)
277
278
  if pos < len(self.large) and self.large[pos] == key:
@@ -409,7 +410,8 @@ class BoolHybridArray(MutableSequence,Exception,metaclass=ResurrectMeta):
409
410
  def __copy__(self) -> BoolHybridArray:
410
411
  return self.copy()
411
412
  def find(self,value):
412
- return BHA_List([i for i in range(len(self)) if self[i]==value])
413
+ from .int_array import IntHybridArray
414
+ return IntHybridArray([i for i in range(len(self)) if self[i]==value])
413
415
  def extend(self, iterable:Iterable) -> None:
414
416
  if isinstance(iterable, (Iterator, Generator, map)):
415
417
  iterable,copy = itertools.tee(iterable, 2)
@@ -517,7 +519,7 @@ class BoolHybridArr(BoolHybridArray,metaclass=ResurrectMeta):
517
519
  split_index = int(min(size * 0.8, math.sqrt(size) * 100))
518
520
  split_index = math.isqrt(size) if true_count>size/3*2 or true_count<size/3 else max(split_index, 1)
519
521
  split_index = int(split_index) if split_index < 150e+7*2 else int(145e+7*2)
520
- arr = BoolHybridArray(split_index, size, is_sparse, Type, hash_ = F)
522
+ arr = BoolHybridArray(split_index = split_index, size = size, is_sparse = is_sparse, Type = Type, hash_ = F)
521
523
  small_max_idx = min(split_index, size - 1)
522
524
  if a:
523
525
  small_data = []
@@ -766,21 +768,38 @@ def Ask_arr(arr):
766
768
  def Ask_BHA(path):
767
769
  if '.bha' not in path.lower():
768
770
  path += '.bha'
769
- with open(path,'a+',encoding = 'utf-8') as f:
771
+ with open(path, 'a+b') as f:
770
772
  f.seek(0)
771
- temp = f.read().strip()
772
- if not temp:return TruesArray(0)
773
- temp = temp.strip().split()
773
+ file_size = os.fstat(f.fileno()).st_size
774
+ if not file_size:
775
+ return TruesArray(0)
776
+ if os.name == 'nt':
777
+ mm = mmap.mmap(f.fileno(), file_size, access=mmap.ACCESS_READ)
778
+ else:
779
+ mm = mmap.mmap(f.fileno(), file_size, flags=mmap.MAP_PRIVATE, prot=mmap.PROT_READ)
780
+ with mm:
781
+ temp = mm.read().decode('utf-8').strip()
782
+ temp = temp.split()
774
783
  temp2 = lambda x:BoolHybridArr(map(int,'0'*(len(x) - len(x.lstrip('0')))+bin(int(x,base = 16))[2:]),hash_ = F)
775
784
  temp = BHA_List(map(temp2,temp))
776
785
  if len(temp) == 1:
777
786
  return temp[0]
778
787
  return temp
779
- def Create_BHA(path,text):
788
+ def Create_BHA(path,arr):
780
789
  if '.bha' not in path.lower():
781
790
  path += '.bha'
782
- with open(path,'w+',encoding = 'utf-8') as f:
783
- f.write(Ask_arr(text))
791
+ temp = Ask_arr(arr).strip().encode('utf-8')
792
+ with open(path, "w+b") as f:
793
+ f.truncate(len(temp))
794
+ if not len(temp):
795
+ return
796
+ with mmap.mmap(
797
+ f.fileno(),
798
+ length=len(temp),
799
+ access=mmap.ACCESS_WRITE
800
+ ) as mm:
801
+ mm[:] = temp
802
+ mm.flush()
784
803
  def numba_opt():
785
804
  import numba
786
805
  sig = numba.types.Union([
@@ -0,0 +1,203 @@
1
+ from __future__ import annotations
2
+ from ..core import *
3
+ import builtins
4
+
5
+ class IntBitTag(BHA_Bool, metaclass=ResurrectMeta):
6
+ def __str__(self):
7
+ return "'-1'" if (hasattr(self, 'is_sign_bit') and self.is_sign_bit and self) else "'1'" if self else "'0'"
8
+ __repr__ = __str__
9
+
10
+ class IntHybridArray(BoolHybridArray):
11
+ def __init__(self, int_array: list[int], bit_length: int = 8):
12
+ self.bit_length = bit_length
13
+ bool_data = []
14
+ max_required_bits = 1
15
+ for num in int_array:
16
+ if num == 0:
17
+ required_bits = 1
18
+ else:
19
+ abs_num = abs(num)
20
+ num_bits_needed = abs_num.bit_length()
21
+ required_bits = 1 + num_bits_needed
22
+ if required_bits > max_required_bits:
23
+ max_required_bits = required_bits
24
+ self.bit_length = max_required_bits
25
+ for num in int_array:
26
+ if num >= 0:
27
+ sign_bit = False
28
+ num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
29
+ else:
30
+ sign_bit = True
31
+ abs_num = abs(num)
32
+ num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
33
+ carry = 1
34
+ for j in range(len(num_bits)):
35
+ if carry:
36
+ num_bits[j] = not num_bits[j]
37
+ carry = 0 if num_bits[j] else 1
38
+ bool_data.append(sign_bit)
39
+ bool_data.extend(num_bits)
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):
48
+ if i < self.size:
49
+ bit_tag = super().__getitem__(i)
50
+ bit_tag.is_sign_bit = True
51
+
52
+ def to_int(self, bit_chunk):
53
+ sign_bit = bit_chunk[0].value
54
+ num_bits = [bit.value for bit in bit_chunk[1:]]
55
+ if not sign_bit:
56
+ num = 0
57
+ for j in range(len(num_bits)):
58
+ if num_bits[j]:
59
+ num += (1 << j)
60
+ else:
61
+ num_bits_inv = [not b for b in num_bits]
62
+ carry = 1
63
+ for j in range(len(num_bits_inv)):
64
+ if carry:
65
+ num_bits_inv[j] = not num_bits_inv[j]
66
+ carry = 0 if num_bits_inv[j] else 1
67
+ num = 0
68
+ for j in range(len(num_bits_inv)):
69
+ if num_bits_inv[j]:
70
+ num += (1 << j)
71
+ num = -num
72
+ return num
73
+
74
+ def __getitem__(self, key):
75
+ if isinstance(key, slice):
76
+ start, stop, step = key.indices(len(self))
77
+ result = []
78
+ for i in range(start, stop, step):
79
+ block_start = i * self.bit_length
80
+ block_end = block_start + self.bit_length
81
+ if block_end > self.size:
82
+ raise IndexError("索引超出范围")
83
+ bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
84
+ num = self.to_int(bit_chunk)
85
+ result.append(num)
86
+ return IntHybridArray(result, self.bit_length)
87
+ key = key if key >= 0 else key + len(self)
88
+ if not (0 <= key < len(self)):
89
+ raise IndexError("索引超出范围")
90
+ block_start = key * self.bit_length
91
+ block_end = block_start + self.bit_length
92
+ if block_end > self.size:
93
+ raise IndexError("索引超出范围")
94
+ bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
95
+ return self.to_int(bit_chunk)
96
+
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().__setitem__(block_start + bit_idx, bool_data[bit_idx])
149
+
150
+ def __iter__(self):
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)]
155
+ yield self.to_int(bit_chunk)
156
+
157
+ def __str__(self):
158
+ return f"IntHybridArray([{', '.join(map(str, self))}])"
159
+ __repr__ = __str__
160
+
161
+ def __len__(self):
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
@@ -0,0 +1,2 @@
1
+ # **作者的秘密:我才10岁!!!**
2
+
@@ -1,24 +1,38 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bool-hybrid-array
3
- Version: 9.10.5
3
+ Version: 9.10.15
4
4
  Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
5
+ Home-page: https://github.com/BKsell/bool-hybrid-array
5
6
  Author: 蔡靖杰
6
7
  Author-email: 1289270215@qq.com
8
+ Project-URL: GitHub 主站, https://github.com/BKsell/bool-hybrid-array
9
+ Project-URL: GitHub 中文镜像, https://www.github-zh.com/projects/1083175506-bool-hybrid-array
10
+ Project-URL: Issue 反馈(主站), https://github.com/BKsell/bool-hybrid-array/issues
7
11
  Keywords: boolean array,compact storage
8
12
  Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.8
14
+ Classifier: Programming Language :: Python :: 3.9
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
9
19
  Classifier: License :: OSI Approved :: MIT License
10
20
  Classifier: Operating System :: OS Independent
11
21
  Requires-Python: >=3.8
12
22
  Description-Content-Type: text/markdown
13
23
  License-File: LICENSE
14
24
  Requires-Dist: numpy>=1.19.0
25
+ Provides-Extra: int-array
15
26
  Dynamic: author
16
27
  Dynamic: author-email
17
28
  Dynamic: classifier
18
29
  Dynamic: description
19
30
  Dynamic: description-content-type
31
+ Dynamic: home-page
20
32
  Dynamic: keywords
21
33
  Dynamic: license-file
34
+ Dynamic: project-url
35
+ Dynamic: provides-extra
22
36
  Dynamic: requires-dist
23
37
  Dynamic: requires-python
24
38
  Dynamic: summary
@@ -378,6 +392,24 @@ BoolHybridArr([False,False,False,False,True,True,False,True,True,False]),
378
392
  try:numba_opt()
379
393
  except:print("请先安装numba库!!!")
380
394
 
395
+ #int_array模块(9.10.10新增):
396
+
397
+ max_num = (1 << 256) - 1
398
+ min_num = -max_num
399
+
400
+ # 1. IntHybridArray:257位完美存储
401
+ arr_hybrid = int_array.IntHybridArray([max_num, min_num, 123456], bit_length=257)
402
+ print("✅ IntHybridArray存储结果:")
403
+ print(f"最大值:{arr_hybrid[0]}")
404
+ print(f"最小值:{arr_hybrid[1]}")
405
+
406
+ # 2. NumPy:用最大的int64尝试存储(必然失败)
407
+ try:
408
+ arr_np = np.array([max_num, min_num, 123456], dtype=np.int64)
409
+ print("\n❌ NumPy存储结果:", arr_np)
410
+ except OverflowError as e:
411
+ print(f"\n❌ NumPy存储失败:{e}")
412
+
381
413
  ```
382
414
 
383
415
  ## 性能优势
@@ -518,6 +550,18 @@ except:print("请先安装numba库!!!")
518
550
  * **9.10.3**:解决少补前导零的问题
519
551
  * **9.10.4**:新增numba_opt功能
520
552
  * **9.10.5**:新增BHA_Opener工具包
553
+ * **9.10.6**:给Ask_BHA新增了mmap优化
554
+ * **9.10.7**:修复了RecursionError: maximum recursion depth exceeded错误
555
+ * **9.10.8**:给Create_BHA新增了mmap优化
556
+ * **9.10.9**:修复9.10.8版本中的NameError错误
557
+ * **9.10.10**:新增int_array模块
558
+ * **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
559
+ * **9.10.12**:把find方法的返回值改为IntHybridArray
560
+ * **9.10.13**:给IntHybridArray新增多种列表操作
561
+ * **9.10.14**:修复IntHybridArray中因单个 0 导致所有数字位长被压缩到 1的问题
562
+ * **9.10.15**:修复IntHybridArray变成布尔数组的错误
563
+
564
+
521
565
 
522
566
 
523
567
  ## **彩蛋:**
@@ -4,8 +4,10 @@ setup.py
4
4
  bool_hybrid_array/__init__.py
5
5
  bool_hybrid_array/__main__.py
6
6
  bool_hybrid_array/core.py
7
+ bool_hybrid_array/秘密.md
7
8
  bool_hybrid_array.egg-info/PKG-INFO
8
9
  bool_hybrid_array.egg-info/SOURCES.txt
9
10
  bool_hybrid_array.egg-info/dependency_links.txt
10
11
  bool_hybrid_array.egg-info/requires.txt
11
- bool_hybrid_array.egg-info/top_level.txt
12
+ bool_hybrid_array.egg-info/top_level.txt
13
+ bool_hybrid_array/int_array/__init__.py
@@ -8,8 +8,9 @@ def get_long_description():
8
8
  return "一个高效的布尔数组(密集+稀疏混合存储,节省内存)"
9
9
  setup(
10
10
  name="bool-hybrid-array",
11
- version="9.10.5",
11
+ version="9.10.15",
12
12
  author="蔡靖杰",
13
+ extras_require={"int_array":[]},
13
14
  author_email="1289270215@qq.com",
14
15
  description="一个高效的布尔数组(密集+稀疏混合存储,节省内存)",
15
16
  long_description=get_long_description(),
@@ -19,10 +20,22 @@ setup(
19
20
  install_requires=['numpy>=1.19.0'],
20
21
  classifiers=[
21
22
  "Programming Language :: Python :: 3",
23
+ 'Programming Language :: Python :: 3.8',
24
+ 'Programming Language :: Python :: 3.9',
25
+ 'Programming Language :: Python :: 3.10',
26
+ 'Programming Language :: Python :: 3.11',
27
+ 'Programming Language :: Python :: 3.12',
28
+ 'Programming Language :: Python :: 3.13',
22
29
  "License :: OSI Approved :: MIT License",
23
30
  "Operating System :: OS Independent",
24
31
  ],
25
32
  keywords="boolean array, compact storage",
26
- package_data={"": ["README.md", "LICENSE",'temp.py', 'temp.cmd','BHA_Opener.exe']},
33
+ package_data={"": ["README.md", "LICENSE",'temp.py', 'temp.cmd','BHA_Opener.zip'],"bool_hybrid_array":["*"]},
27
34
  include_package_data=True,
35
+ url="https://github.com/BKsell/bool-hybrid-array",
36
+ project_urls={
37
+ "GitHub 主站": "https://github.com/BKsell/bool-hybrid-array",
38
+ "GitHub 中文镜像": "https://www.github-zh.com/projects/1083175506-bool-hybrid-array",
39
+ "Issue 反馈(主站)": "https://github.com/BKsell/bool-hybrid-array/issues",
40
+ },
28
41
  )