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.
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/PKG-INFO +45 -1
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/README.md +30 -0
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array/__init__.py +4 -2
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array/__main__.py +17 -0
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array/core.py +31 -12
- bool_hybrid_array-9.10.15/bool_hybrid_array/int_array/__init__.py +203 -0
- bool_hybrid_array-9.10.15/bool_hybrid_array//347/247/230/345/257/206.md +2 -0
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array.egg-info/PKG-INFO +45 -1
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array.egg-info/SOURCES.txt +3 -1
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array.egg-info/requires.txt +2 -0
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/setup.py +15 -2
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/LICENSE +0 -0
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array.egg-info/dependency_links.txt +0 -0
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array.egg-info/top_level.txt +0 -0
- {bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/setup.cfg +0 -0
|
@@ -1,24 +1,38 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bool-hybrid-array
|
|
3
|
-
Version: 9.10.
|
|
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
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
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+'
|
|
771
|
+
with open(path, 'a+b') as f:
|
|
770
772
|
f.seek(0)
|
|
771
|
-
|
|
772
|
-
if not
|
|
773
|
-
|
|
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,
|
|
788
|
+
def Create_BHA(path,arr):
|
|
780
789
|
if '.bha' not in path.lower():
|
|
781
790
|
path += '.bha'
|
|
782
|
-
|
|
783
|
-
|
|
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
|
|
@@ -1,24 +1,38 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bool-hybrid-array
|
|
3
|
-
Version: 9.10.
|
|
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
|
## **彩蛋:**
|
{bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array.egg-info/SOURCES.txt
RENAMED
|
@@ -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.
|
|
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.
|
|
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
|
)
|
|
File without changes
|
|
File without changes
|
{bool_hybrid_array-9.10.5 → bool_hybrid_array-9.10.15}/bool_hybrid_array.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|