bool-hybrid-array 9.10.10__py3-none-any.whl → 9.10.11__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 +3 -2
- bool_hybrid_array/__main__.py +5 -0
- bool_hybrid_array/int_array/__init__.py +53 -37
- {bool_hybrid_array-9.10.10.dist-info → bool_hybrid_array-9.10.11.dist-info}/METADATA +2 -1
- bool_hybrid_array-9.10.11.dist-info/RECORD +10 -0
- bool_hybrid_array-9.10.10.dist-info/RECORD +0 -10
- {bool_hybrid_array-9.10.10.dist-info → bool_hybrid_array-9.10.11.dist-info}/WHEEL +0 -0
- {bool_hybrid_array-9.10.10.dist-info → bool_hybrid_array-9.10.11.dist-info}/licenses/LICENSE +0 -0
- {bool_hybrid_array-9.10.10.dist-info → bool_hybrid_array-9.10.11.dist-info}/top_level.txt +0 -0
bool_hybrid_array/__init__.py
CHANGED
|
@@ -2,14 +2,15 @@ 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.11"
|
|
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
|
bool_hybrid_array/__main__.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
from ..core import *
|
|
2
3
|
import builtins
|
|
3
4
|
|
|
4
|
-
|
|
5
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'"
|
|
@@ -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
|
-
|
|
41
|
-
super().__init__(
|
|
42
|
-
for idx in range(
|
|
43
|
-
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
99
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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,19 @@ 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
|
|
122
|
-
|
|
123
|
-
|
|
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.
|
|
128
|
-
|
|
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))}])"
|
|
133
159
|
|
|
134
160
|
def __len__(self):
|
|
135
|
-
return self.
|
|
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])
|
|
161
|
+
return self.total_bits // self.bit_length
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bool-hybrid-array
|
|
3
|
-
Version: 9.10.
|
|
3
|
+
Version: 9.10.11
|
|
4
4
|
Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
|
|
5
5
|
Home-page: https://github.com/BKsell/bool-hybrid-array
|
|
6
6
|
Author: 蔡靖杰
|
|
@@ -541,6 +541,7 @@ arr = int_array.IntHybridArray([100,-27623,18276,-32165])
|
|
|
541
541
|
* **9.10.8**:给Create_BHA新增了mmap优化
|
|
542
542
|
* **9.10.9**:修复9.10.8版本中的NameError错误
|
|
543
543
|
* **9.10.10**:新增int_array模块
|
|
544
|
+
* **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
|
|
544
545
|
|
|
545
546
|
|
|
546
547
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
bool_hybrid_array/__init__.py,sha256=IqtYvdH7w00YYmTgbQ9Q2DKMKIQoGM9728UQ0JOSox8,793
|
|
2
|
+
bool_hybrid_array/__main__.py,sha256=xb4p6L-JlVWor0CVVKqjoxKVH3YvA8pfRTBG4AFHqQU,7833
|
|
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=1ysgXyfJcmSPK4Fs3Qd7JGlESwXyYn9WsPVaI6LtrxA,6872
|
|
6
|
+
bool_hybrid_array-9.10.11.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
|
|
7
|
+
bool_hybrid_array-9.10.11.dist-info/METADATA,sha256=LY4eVuUqmSFXk_ay6uzbZ0YmKW2SSxaIFMBF13xg4TY,22008
|
|
8
|
+
bool_hybrid_array-9.10.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
9
|
+
bool_hybrid_array-9.10.11.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
|
|
10
|
+
bool_hybrid_array-9.10.11.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,,
|
|
File without changes
|
{bool_hybrid_array-9.10.10.dist-info → bool_hybrid_array-9.10.11.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|