bool-hybrid-array 9.6.4__py3-none-any.whl → 9.10.19__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 +35 -4
- bool_hybrid_array/__main__.py +284 -0
- bool_hybrid_array/core.py +313 -67
- bool_hybrid_array/int_array/__init__.py +203 -0
- bool_hybrid_array//321/207/320/267/320/250/321/205/320/277/320/226.md +2 -0
- {bool_hybrid_array-9.6.4.dist-info → bool_hybrid_array-9.10.19.dist-info}/METADATA +210 -33
- bool_hybrid_array-9.10.19.dist-info/RECORD +10 -0
- bool_hybrid_array-9.6.4.dist-info/RECORD +0 -7
- {bool_hybrid_array-9.6.4.dist-info → bool_hybrid_array-9.10.19.dist-info}/WHEEL +0 -0
- {bool_hybrid_array-9.6.4.dist-info → bool_hybrid_array-9.10.19.dist-info}/licenses/LICENSE +0 -0
- {bool_hybrid_array-9.6.4.dist-info → bool_hybrid_array-9.10.19.dist-info}/top_level.txt +0 -0
bool_hybrid_array/__init__.py
CHANGED
|
@@ -1,16 +1,47 @@
|
|
|
1
1
|
import sys
|
|
2
|
-
from types import ModuleType
|
|
2
|
+
from types import ModuleType,FunctionType
|
|
3
3
|
from . import core
|
|
4
|
-
import builtins
|
|
5
|
-
|
|
4
|
+
from .core import __builtins__,builtins
|
|
5
|
+
from . import int_array
|
|
6
|
+
__version__ = "9.10.19"
|
|
6
7
|
public_objects = []
|
|
8
|
+
def jit_class_methods(cls):
|
|
9
|
+
for attr_name in dir(cls):
|
|
10
|
+
if not attr_name.startswith("_"):
|
|
11
|
+
attr = getattr(cls, attr_name)
|
|
12
|
+
if isinstance(attr, FunctionType):
|
|
13
|
+
try:
|
|
14
|
+
setattr(cls, attr_name, jit(attr))
|
|
15
|
+
except:
|
|
16
|
+
pass
|
|
17
|
+
elif isinstance(attr, classmethod):
|
|
18
|
+
original_func = attr.__func__
|
|
19
|
+
try:
|
|
20
|
+
setattr(cls, attr_name, classmethod(jit(original_func)))
|
|
21
|
+
except:
|
|
22
|
+
pass
|
|
23
|
+
return cls
|
|
7
24
|
for name in dir(core):
|
|
8
25
|
if not name.startswith("_"):
|
|
9
26
|
obj = getattr(core, name)
|
|
10
27
|
if isinstance(obj, (type, ModuleType)) or callable(obj):
|
|
11
28
|
public_objects.append(name)
|
|
12
|
-
|
|
29
|
+
if isinstance(obj,FunctionType):
|
|
30
|
+
try:setattr(core,name,jit(obj))
|
|
31
|
+
except:pass
|
|
32
|
+
elif isinstance(obj,type):
|
|
33
|
+
jit_class_methods(obj)
|
|
34
|
+
__all__ = public_objects + ["__version__","__builtins__","core","builtins","__dict__","int_array"]
|
|
13
35
|
globals().update({
|
|
14
36
|
name: getattr(core, name)
|
|
15
37
|
for name in public_objects
|
|
16
38
|
})
|
|
39
|
+
try:
|
|
40
|
+
__dict__ = ProtectedBuiltinsDict(globals())
|
|
41
|
+
sys.modules[__name__+'.int_array'] = ProtectedBuiltinsDict(int_array.__dict__)
|
|
42
|
+
sys.modules[__name__] = ProtectedBuiltinsDict(globals().copy())
|
|
43
|
+
sys.modules[__name__].name = 'bool_hybrid_array'
|
|
44
|
+
core.__dict__ = ProtectedBuiltinsDict(core.__dict__)
|
|
45
|
+
except:
|
|
46
|
+
pass
|
|
47
|
+
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
from .__init__ import *
|
|
2
|
+
|
|
3
|
+
# 创建实例
|
|
4
|
+
|
|
5
|
+
arr = BoolHybridArr([True, False, True, False, True])
|
|
6
|
+
|
|
7
|
+
arr2 = TruesArray(3)#7.9.0新增
|
|
8
|
+
|
|
9
|
+
arr3 = FalsesArray(3)#7.9.0新增
|
|
10
|
+
|
|
11
|
+
# 访问元素
|
|
12
|
+
print(arr[0]) # 输出: True;
|
|
13
|
+
|
|
14
|
+
print(arr[1:4]) # 输出: BoolHybridArr([False, True, False]);
|
|
15
|
+
|
|
16
|
+
print(arr2)# 输出: BoolHybridArr([True, True, True]);
|
|
17
|
+
|
|
18
|
+
print(arr3) # 输出: BoolHybridArr([False, False, False]);
|
|
19
|
+
|
|
20
|
+
arr[2] = False
|
|
21
|
+
|
|
22
|
+
print(arr) # 输出: BoolHybridArr([True, False, False, False, True])
|
|
23
|
+
|
|
24
|
+
# 创建包含大量布尔值的数组(大部分为False)
|
|
25
|
+
|
|
26
|
+
big_arr = BoolHybridArr([i % 100 == 0 for i in range(10000)])
|
|
27
|
+
|
|
28
|
+
# 查看存储模式(此时应为稀疏模式)
|
|
29
|
+
|
|
30
|
+
print(repr(big_arr)) # 输出: BoolHybridArray(split_index=100,size=10000,is_sparse=True,small_len=100,large_len=)不好意思large_len我不知道
|
|
31
|
+
|
|
32
|
+
# 自动优化存储
|
|
33
|
+
|
|
34
|
+
big_arr.optimize()
|
|
35
|
+
|
|
36
|
+
# 统计True的数量
|
|
37
|
+
|
|
38
|
+
print(arr.count(True)) # 输出: 2
|
|
39
|
+
|
|
40
|
+
# 检查是否至少有一个True
|
|
41
|
+
|
|
42
|
+
print(any(arr)) # 输出: True
|
|
43
|
+
|
|
44
|
+
# 检查是否全为True
|
|
45
|
+
|
|
46
|
+
print(all(arr)) # 输出: False
|
|
47
|
+
|
|
48
|
+
# 复制数组(7.9.1新增)
|
|
49
|
+
|
|
50
|
+
arr_copy = arr.copy()
|
|
51
|
+
|
|
52
|
+
arr_copy[0] = False
|
|
53
|
+
|
|
54
|
+
print(arr[0]) # 输出: True(原数组不变)
|
|
55
|
+
|
|
56
|
+
print(arr_copy[0]) # 输出: False(拷贝数组已修改)
|
|
57
|
+
|
|
58
|
+
#寻找一个元素出现的索引(7.9.2新增)
|
|
59
|
+
|
|
60
|
+
arr_find = BoolHybridArr([i % 2 for i in range(10)])
|
|
61
|
+
|
|
62
|
+
print(arr_find.find(True))#输出:[1,3,5,7,9]
|
|
63
|
+
|
|
64
|
+
print(arr_find.find(False))#输出:[2,4,6,8,10]
|
|
65
|
+
|
|
66
|
+
# 查找第一个/最后一个出现的位置(7.10.3新增)
|
|
67
|
+
|
|
68
|
+
print(arr_find.index(True)) # 输出:1(第一个True的位置)
|
|
69
|
+
|
|
70
|
+
print(arr_find.rindex(True)) # 输出:9(最后一个True的位置)
|
|
71
|
+
|
|
72
|
+
#index/rindex的空数组处理(7.10.4新增)
|
|
73
|
+
|
|
74
|
+
none_arr = BoolHybridArr([])
|
|
75
|
+
try:print(none_arr.index(True))#ValueError:无法在空的 BoolHybridArray 中查找元素
|
|
76
|
+
except ValueError as e:print(e)
|
|
77
|
+
|
|
78
|
+
#查看是否需要优化(7.10.7新增,7.10.20+能用)
|
|
79
|
+
|
|
80
|
+
print(big_arr.memory_usage(detail=True))
|
|
81
|
+
'''样例输出(瞎编,但格式是这样)
|
|
82
|
+
{
|
|
83
|
+
"总占用(字节)": 210,
|
|
84
|
+
"密集区占用": 180,
|
|
85
|
+
"稀疏区占用": 30,
|
|
86
|
+
"对比原生list节省": "99.5%",
|
|
87
|
+
"对比numpy节省": "79.0%",
|
|
88
|
+
"是否需要优化": "是",
|
|
89
|
+
"优化理由/说明": "稀疏区索引密度过高,优化后可转为密集存储提升速度"
|
|
90
|
+
}
|
|
91
|
+
'''
|
|
92
|
+
big_arr.optimize() # 调用优化方法
|
|
93
|
+
|
|
94
|
+
print(big_arr.memory_usage(detail=True)["是否需要优化"])#"否"
|
|
95
|
+
|
|
96
|
+
'''当处理动态变化的布尔数组(如频繁增删元素)时,建议在关键操作后调用memory_usage(detail=True)检查状态,通过optimize()保持最优性能。'''
|
|
97
|
+
|
|
98
|
+
#将数组转为int类型(7.11.0新增):
|
|
99
|
+
|
|
100
|
+
print(int(arr))#输出:17(0b10001)
|
|
101
|
+
|
|
102
|
+
#位运算(7.13.0新增)
|
|
103
|
+
|
|
104
|
+
arr1 = BoolHybridArr([True, False, True, False]) # 0b1010
|
|
105
|
+
|
|
106
|
+
arr2 = BoolHybridArr([True, True, False, False]) # 0b1100
|
|
107
|
+
|
|
108
|
+
print(arr1 & arr2) # 输出:BoolHybridArr([True,False,False,False]) # 0b1000
|
|
109
|
+
|
|
110
|
+
print(arr1 | arr2) # 输出:BoolHybridArr([True,True,True,False]) # 0b1110
|
|
111
|
+
|
|
112
|
+
print([True, False] | arr1[:2]) # 反向运算:[True,False] | [True,False] → [True,False]
|
|
113
|
+
|
|
114
|
+
print(arr1 ^ arr2) # 输出:BoolHybridArr([False,True,True,False]) # 0b0110
|
|
115
|
+
|
|
116
|
+
print(~arr1) # 输出:BoolHybridArr([False,True,False,True]) # 0b0101(对应整数 ~10 = -11 的二进制布尔逻辑)
|
|
117
|
+
|
|
118
|
+
arr = BoolHybridArr([True, False, True]) # 0b101
|
|
119
|
+
|
|
120
|
+
arr <<= 2 # 左移2位:尾部补2个False → [True,False,True,False,False](0b10100)
|
|
121
|
+
|
|
122
|
+
print(arr)
|
|
123
|
+
|
|
124
|
+
arr >>= 3 # 右移3位:尾部删3个元素 → [True,False](0b10)
|
|
125
|
+
|
|
126
|
+
print(arr)
|
|
127
|
+
|
|
128
|
+
print(arr << -1) # 负数左移:等价于右移1位 → [True]
|
|
129
|
+
|
|
130
|
+
#兼容numpy数组(8.0.0版本新增)
|
|
131
|
+
|
|
132
|
+
arr_BoolHybridArray = BoolHybridArr([])
|
|
133
|
+
arr_BoolHybridArray <<= 10
|
|
134
|
+
arr_BoolHybridArray <<= 10000
|
|
135
|
+
array_numpy = np.array([arr_BoolHybridArray,arr_BoolHybridArray],dtype = object)
|
|
136
|
+
|
|
137
|
+
#支持哈希(8.2.0版本新增)
|
|
138
|
+
|
|
139
|
+
set_ = {arr_BoolHybridArray}#不会报错呦
|
|
140
|
+
|
|
141
|
+
_2darr = BHA_List([BoolHybridArr([1,0,0,0,1],Type = BHA_Bool),TruesArray(5,Type = bool),FalsesArray(5,Type = np.bool_)])
|
|
142
|
+
|
|
143
|
+
print(_2darr)
|
|
144
|
+
|
|
145
|
+
'''输出:
|
|
146
|
+
|
|
147
|
+
BHA_List([
|
|
148
|
+
BoolHybridArr([True,False,False,False,True]),
|
|
149
|
+
BoolHybridArr([True,True,True,True,True]),
|
|
150
|
+
BoolHybridArr([False,False,False,False,False]),
|
|
151
|
+
])
|
|
152
|
+
'''
|
|
153
|
+
|
|
154
|
+
#BoolHybridArray是布尔数组,那是什么布尔数组呢?numpy.bool_?原生bool?其他库的布尔类型?还是本库的BHA_Bool?Type参数,支持指定!
|
|
155
|
+
|
|
156
|
+
#还更新了用BHA_List的排版模拟二维布尔数组!
|
|
157
|
+
|
|
158
|
+
#二维数组的optimize与memory_usage(9.1.0新增):
|
|
159
|
+
|
|
160
|
+
_2darr.optimize()
|
|
161
|
+
|
|
162
|
+
_2darr.memory_usage(detail=T)
|
|
163
|
+
|
|
164
|
+
'''
|
|
165
|
+
输出格式:
|
|
166
|
+
{
|
|
167
|
+
"占用(字节)": 【占用内存(字节)】,
|
|
168
|
+
"对比原生list节省": 【6位百分比】,
|
|
169
|
+
"对比numpy节省": 【6位百分比】}
|
|
170
|
+
'''
|
|
171
|
+
|
|
172
|
+
#注:BoolHybridArray的memory_usage的百分比也变成了六位小数
|
|
173
|
+
|
|
174
|
+
#关闭哈希复用(9.4.0新增)
|
|
175
|
+
|
|
176
|
+
_2darr2 = BHA_List(BoolHybridArr((i%100 for i in range(1000)),hash_ = F) for i in range(1000))
|
|
177
|
+
|
|
178
|
+
#关闭哈希复用可以增快创建速度
|
|
179
|
+
|
|
180
|
+
#ResurrectMeta元类(9.5.0新增)
|
|
181
|
+
|
|
182
|
+
class MyClass(metaclass=ResurrectMeta):
|
|
183
|
+
pass
|
|
184
|
+
|
|
185
|
+
#用装饰器给实例添加动态方法(9.6.0新增):
|
|
186
|
+
|
|
187
|
+
arr = BoolHybridArr([T,F,T])
|
|
188
|
+
|
|
189
|
+
@arr
|
|
190
|
+
def toggle_range(self, start: int, end: int):
|
|
191
|
+
"""翻转从 start 到 end(含)的布尔值"""
|
|
192
|
+
for i in range(start, end + 1):
|
|
193
|
+
self[i] = not self[i] # 通过 self 操作实例的元素
|
|
194
|
+
print(f"翻转 {start}-{end} 后:", self)
|
|
195
|
+
|
|
196
|
+
arr.toggle_range(0,1)
|
|
197
|
+
|
|
198
|
+
print(arr) #输出:翻转 {0}-{1} 后:BoolHybridArr(False,True,True)
|
|
199
|
+
|
|
200
|
+
toggle_range(arr,0,1) #输出:翻转 {0}-{1} 后:BoolHybridArr(True,False,True)
|
|
201
|
+
|
|
202
|
+
#view方法(9.7.0新增):
|
|
203
|
+
|
|
204
|
+
arr2 = arr.view()
|
|
205
|
+
|
|
206
|
+
arr2.extend([F,T])
|
|
207
|
+
|
|
208
|
+
arr2[2] = F
|
|
209
|
+
|
|
210
|
+
print(arr) #输出:BoolHybridArr([True,False,False,False,True])
|
|
211
|
+
|
|
212
|
+
#python 3.9以下的版本泛型、联合类型支持(9.8.0新增)
|
|
213
|
+
|
|
214
|
+
print(BHA_List[BoolHybridArray])#输出:bool_hybrid_array.BHA_List[bool_hybrid_array.BoolHybridArray]
|
|
215
|
+
|
|
216
|
+
print(BHA_List|BoolHybridArray)#输出:typing.Union[bool_hybrid_array.BHA_List, bool_hybrid_array.BoolHybridArray] (python 3.9以下)或 bool_hybrid_array.BHA_List|bool_hybrid_array.BoolHybridArray(python 3.10以上)
|
|
217
|
+
|
|
218
|
+
#BHA_Function动态创建函数(9.9.0新增):
|
|
219
|
+
|
|
220
|
+
toggle_range = BHA_Function.string_define(
|
|
221
|
+
name = 'toggle_range',
|
|
222
|
+
text =
|
|
223
|
+
'''
|
|
224
|
+
for i in range(start, end + 1):
|
|
225
|
+
self[i] = not self[i] # 通过 self 操作实例的元素
|
|
226
|
+
print(f"翻转 {start}-{end} 后:", self)''',
|
|
227
|
+
positional = ('self','start', 'end'),
|
|
228
|
+
default = {})
|
|
229
|
+
toggle_range([0,0,1],0,1)#输出:翻转 0-1 后: [True, True, 1]
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
#开放ProtectedBuiltinsDict类型(9.9.3+)
|
|
233
|
+
|
|
234
|
+
Dict = ProtectedBuiltinsDict({'1':1,'2':2},protected_names = ['1','3'],name = 'Dict')
|
|
235
|
+
|
|
236
|
+
Dict['2'] = 1
|
|
237
|
+
|
|
238
|
+
print(Dict) #输出:{'1':1,'2':1}
|
|
239
|
+
|
|
240
|
+
try:Dict['1'] = 2
|
|
241
|
+
except Exception as e:print(e) #输出:禁止修改内置常量:__Dict__['1']
|
|
242
|
+
|
|
243
|
+
#Ask_BHA和Create_BHA(9.10.0新增):
|
|
244
|
+
|
|
245
|
+
arr = BoolHybridArr([T,F,F,F,T,T,F,F,F,T])
|
|
246
|
+
arr2 = BoolHybridArr([F,F,F,F,T,T,F,T,T,F])
|
|
247
|
+
|
|
248
|
+
arr3 = BHA_List([arr,arr2])
|
|
249
|
+
|
|
250
|
+
Create_BHA("single_bool_array",arr3)#自动生成single_bool_array.bha文件
|
|
251
|
+
|
|
252
|
+
print(Ask_BHA("single_bool_array"))
|
|
253
|
+
|
|
254
|
+
'''
|
|
255
|
+
输出:
|
|
256
|
+
BHA_List([
|
|
257
|
+
BoolHybridArr([True,False,False,False,True,True,False,False,False,True]),
|
|
258
|
+
BoolHybridArr([False,False,False,False,True,True,False,True,True,False]),
|
|
259
|
+
])
|
|
260
|
+
'''
|
|
261
|
+
|
|
262
|
+
#numba_opt函数优化(9.10.4版本新增)
|
|
263
|
+
try:numba_opt()
|
|
264
|
+
except:print("请先安装numba库!!!")
|
|
265
|
+
|
|
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}")
|
|
284
|
+
|