bool-hybrid-array 9.10.21__tar.gz → 9.11.0__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.21 → bool_hybrid_array-9.11.0}/PKG-INFO +14 -2
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/README.md +11 -1
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array/__init__.py +8 -6
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array/__main__.py +4 -0
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array/core.py +56 -34
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array/int_array/__init__.py +9 -12
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array.egg-info/PKG-INFO +14 -2
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/setup.py +4 -2
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/LICENSE +0 -0
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array//347/247/230/345/257/206.md" +0 -0
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array.egg-info/SOURCES.txt +0 -0
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array.egg-info/dependency_links.txt +0 -0
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array.egg-info/requires.txt +0 -0
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array.egg-info/top_level.txt +0 -0
- {bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bool-hybrid-array
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.11.0
|
|
4
4
|
Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
|
|
5
5
|
Home-page: https://github.com/BKsell/bool-hybrid-array
|
|
6
6
|
Author: 蔡靖杰
|
|
@@ -17,6 +17,8 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
21
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
20
22
|
Classifier: License :: OSI Approved :: MIT License
|
|
21
23
|
Classifier: Operating System :: OS Independent
|
|
22
24
|
Requires-Python: >=3.8
|
|
@@ -571,6 +573,12 @@ except OverflowError as e:
|
|
|
571
573
|
* **9.10.19**:和9.10.18.post4相同,正式版本发布
|
|
572
574
|
* **9.10.20**:优化性能,增加BHA_jit_log日志
|
|
573
575
|
* **9.10.21**:优化Ask_BHA,移除BHA_jit_log日志
|
|
576
|
+
* **9.10.22**:进一步优化Ask_BHA的性能
|
|
577
|
+
* **9.11.0**:新增对7.3.10以上的版本的PyPy解释器的支持
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
|
|
574
582
|
|
|
575
583
|
|
|
576
584
|
## **彩蛋:**
|
|
@@ -585,7 +593,11 @@ except OverflowError as e:
|
|
|
585
593
|
* A:BoolHybridArray是本库中的**核心类**,所有函数都是围绕他进行的,但需要`split_index`,`size`,`is_sparse`;
|
|
586
594
|
BoolHybridArr是一个**函数**,用于把一个可迭代对象转为`BoolHybridArray`类
|
|
587
595
|
* Q:为什么不建议把太大的本类型数组打印?
|
|
588
|
-
* A
|
|
596
|
+
* A:虽然BoolHybridArray类型数组省内存,但字符串不省内存,一个`True`要4字节,一个`False`要5字节,连逗号都要占1字节(`numpy.ndarray`:我都比字符串省内存)
|
|
597
|
+
- Q:为什么使用在Windows终端使用PyPy时建议先调用`chcp 65001`再启动PyPy?
|
|
598
|
+
* A:因为本库有很多的的中文报错和打印,项目里也可能会有。Windows终端里的PyPy默认是GBK编码,有中文时会乱码。chcp 65001可以切换到UTF-8编码,防止乱码。
|
|
599
|
+
|
|
600
|
+
|
|
589
601
|
|
|
590
602
|
## 源代码和原理
|
|
591
603
|
|
|
@@ -531,6 +531,12 @@ except OverflowError as e:
|
|
|
531
531
|
* **9.10.19**:和9.10.18.post4相同,正式版本发布
|
|
532
532
|
* **9.10.20**:优化性能,增加BHA_jit_log日志
|
|
533
533
|
* **9.10.21**:优化Ask_BHA,移除BHA_jit_log日志
|
|
534
|
+
* **9.10.22**:进一步优化Ask_BHA的性能
|
|
535
|
+
* **9.11.0**:新增对7.3.10以上的版本的PyPy解释器的支持
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
|
|
534
540
|
|
|
535
541
|
|
|
536
542
|
## **彩蛋:**
|
|
@@ -545,7 +551,11 @@ except OverflowError as e:
|
|
|
545
551
|
* A:BoolHybridArray是本库中的**核心类**,所有函数都是围绕他进行的,但需要`split_index`,`size`,`is_sparse`;
|
|
546
552
|
BoolHybridArr是一个**函数**,用于把一个可迭代对象转为`BoolHybridArray`类
|
|
547
553
|
* Q:为什么不建议把太大的本类型数组打印?
|
|
548
|
-
* A
|
|
554
|
+
* A:虽然BoolHybridArray类型数组省内存,但字符串不省内存,一个`True`要4字节,一个`False`要5字节,连逗号都要占1字节(`numpy.ndarray`:我都比字符串省内存)
|
|
555
|
+
- Q:为什么使用在Windows终端使用PyPy时建议先调用`chcp 65001`再启动PyPy?
|
|
556
|
+
* A:因为本库有很多的的中文报错和打印,项目里也可能会有。Windows终端里的PyPy默认是GBK编码,有中文时会乱码。chcp 65001可以切换到UTF-8编码,防止乱码。
|
|
557
|
+
|
|
558
|
+
|
|
549
559
|
|
|
550
560
|
## 源代码和原理
|
|
551
561
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
1
2
|
import sys
|
|
2
3
|
from types import ModuleType,FunctionType
|
|
3
4
|
from . import core
|
|
4
5
|
from .core import __builtins__,builtins
|
|
5
|
-
from . import int_array
|
|
6
|
-
|
|
6
|
+
try:from . import int_array
|
|
7
|
+
except:pass
|
|
8
|
+
__version__ = "9.11.0"
|
|
7
9
|
public_objects = []
|
|
8
10
|
for name in dir(core):
|
|
9
11
|
if not name.startswith("_"):
|
|
@@ -16,11 +18,11 @@ globals().update({
|
|
|
16
18
|
for name in public_objects
|
|
17
19
|
})
|
|
18
20
|
try:
|
|
19
|
-
__dict__ = ProtectedBuiltinsDict(globals())
|
|
20
|
-
sys.modules[__name__+'.int_array'] = ProtectedBuiltinsDict(int_array.__dict__)
|
|
21
|
-
sys.modules[__name__+'.core'] = ProtectedBuiltinsDict(core.__dict__)
|
|
22
21
|
sys.modules[__name__] = ProtectedBuiltinsDict(globals())
|
|
23
|
-
sys.modules[__name__].name =
|
|
22
|
+
sys.modules[__name__].name = __name__
|
|
23
|
+
sys.modules[__name__+'.core'] = ProtectedBuiltinsDict(core.__dict__,name = f'{__name__}.core')
|
|
24
|
+
__dict__ = ProtectedBuiltinsDict(globals())
|
|
25
|
+
sys.modules[__name__+'.int_array'] = ProtectedBuiltinsDict(int_array.__dict__,name = __name__+'.int_array')
|
|
24
26
|
core.__dict__ = ProtectedBuiltinsDict(core.__dict__)
|
|
25
27
|
except:
|
|
26
28
|
pass
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
import builtins
|
|
3
|
+
from types import MappingProxyType
|
|
3
4
|
import array,bisect,numpy as np
|
|
4
5
|
from collections.abc import MutableSequence,Iterable,Generator,Iterator,Sequence
|
|
5
6
|
import itertools,copy,sys,math,weakref,random,mmap,os
|
|
@@ -8,6 +9,14 @@ import operator,ctypes,gc,abc,types
|
|
|
8
9
|
from functools import lru_cache
|
|
9
10
|
from typing import Union,_GenericAlias
|
|
10
11
|
hybrid_array_cache = []
|
|
12
|
+
try:
|
|
13
|
+
msvcrt = ctypes.CDLL('msvcrt.dll')
|
|
14
|
+
memcpy = msvcrt.memcpy
|
|
15
|
+
except:
|
|
16
|
+
libc = ctypes.CDLL('libc.so.6')
|
|
17
|
+
memcpy = libc.memcpy
|
|
18
|
+
memcpy.argtypes = (ctypes.c_void_p, ctypes.c_void_p, ctypes.c_size_t)
|
|
19
|
+
memcpy.restype = ctypes.c_void_p
|
|
11
20
|
if 'UnionType' in types.__dict__:
|
|
12
21
|
class Union:
|
|
13
22
|
def __getitem__(self,*args):
|
|
@@ -29,12 +38,23 @@ class ResurrectMeta(abc.ABCMeta,metaclass=abc.ABCMeta):
|
|
|
29
38
|
super_cls.__setattr__('bases', bases)
|
|
30
39
|
super_cls.__setattr__('namespace', namespace)
|
|
31
40
|
super_cls.__setattr__('original_dict', dict(obj.__dict__))
|
|
32
|
-
del obj.original_dict["__abstractmethods__"]
|
|
33
|
-
|
|
41
|
+
try:del obj.original_dict["__abstractmethods__"]
|
|
42
|
+
except:pass
|
|
43
|
+
try:del obj.original_dict["_abc_impl"]
|
|
44
|
+
except:pass
|
|
45
|
+
try:del obj.original_dict['_abc_registry']
|
|
46
|
+
except:pass
|
|
47
|
+
try:del obj.original_dict['_abc_cache']
|
|
48
|
+
except:pass
|
|
49
|
+
try:del obj.original_dict['_abc_negative_cache']
|
|
50
|
+
except:pass
|
|
51
|
+
try:del obj.original_dict['_abc_negative_cache_version']
|
|
52
|
+
except:pass
|
|
53
|
+
super_cls.__setattr__('original_dict', MappingProxyType(obj.original_dict))
|
|
34
54
|
return obj
|
|
35
55
|
@lru_cache
|
|
36
56
|
def __str__(cls):
|
|
37
|
-
return
|
|
57
|
+
return f'{cls.__module__}.{cls.name}'
|
|
38
58
|
@lru_cache
|
|
39
59
|
def __repr__(cls,detailed = False):
|
|
40
60
|
if detailed:
|
|
@@ -79,6 +99,7 @@ class ResurrectMeta(abc.ABCMeta,metaclass=abc.ABCMeta):
|
|
|
79
99
|
original_dict["__or__"] = __or__
|
|
80
100
|
except:
|
|
81
101
|
pass
|
|
102
|
+
original_dict = MappingProxyType(original_dict)
|
|
82
103
|
ResurrectMeta.__class__ = ResurrectMeta
|
|
83
104
|
class BHA_Function(metaclass=ResurrectMeta):
|
|
84
105
|
def __init__(self,v):
|
|
@@ -703,11 +724,11 @@ class BHA_Iterator(Iterator,metaclass=ResurrectMeta):
|
|
|
703
724
|
return arr.copy() if copy else arr.view()
|
|
704
725
|
__rand__,__ror__,__rxor__ = __and__,__or__,__xor__
|
|
705
726
|
class ProtectedBuiltinsDict(dict,metaclass=ResurrectMeta):
|
|
706
|
-
def __init__(self, *args, protected_names =
|
|
727
|
+
def __init__(self, *args, protected_names = ("T", "F", "BHA_Bool", "BHA_List", "BoolHybridArray", "BoolHybridArr",
|
|
707
728
|
"TruesArray", "FalsesArray", "ProtectedBuiltinsDict", "builtins",
|
|
708
729
|
"__builtins__", "__dict__","ResurrectMeta","math",
|
|
709
730
|
"np","protected_names","BHA_Function",
|
|
710
|
-
"__class__","Ask_BHA","Create_BHA","Ask_arr","numba_opt"
|
|
731
|
+
"__class__","Ask_BHA","Create_BHA","Ask_arr","numba_opt"),
|
|
711
732
|
name = 'builtins', **kwargs):
|
|
712
733
|
super().__init__(*args, **kwargs)
|
|
713
734
|
if name == 'builtins':
|
|
@@ -715,20 +736,23 @@ class ProtectedBuiltinsDict(dict,metaclass=ResurrectMeta):
|
|
|
715
736
|
super().__setattr__('builtins',self)
|
|
716
737
|
super().__setattr__('__builtins__',self)
|
|
717
738
|
self.name = name
|
|
718
|
-
|
|
739
|
+
super().__setattr__("protected_names",protected_names)
|
|
719
740
|
def __setitem__(self, name, value):
|
|
720
|
-
if
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
if
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
741
|
+
if not hasattr(self,"protected_names"):super().__setitem__(name, value)
|
|
742
|
+
try:
|
|
743
|
+
if name in ["T", "F"]:
|
|
744
|
+
current_T = self.get("T")
|
|
745
|
+
current_F = self.get("F")
|
|
746
|
+
if isinstance(current_T, BHA_bool) and isinstance(current_F, BHA_bool):
|
|
747
|
+
is_swap = (name == "T" and isinstance(value, BHA_bool) and value.value == current_F.value)or(name == "F" and isinstance(value, BHA_bool) and value.value == current_T.value)
|
|
748
|
+
if is_swap:
|
|
749
|
+
print(f"""警告:禁止交换内置常量 __{self.name}__["{name}"] 和 __builtins__["{'F' if name == 'T' else 'T'}"]!""")
|
|
750
|
+
raise AttributeError(f"""禁止交换内置常量 __{self.name}__["{name}"] 和 __{self.name}__["{'F' if name == 'T' else 'T'}"]""")
|
|
751
|
+
if name in self.protected_names and name not in ["T", "F"]:
|
|
752
|
+
print(f"警告:禁止修改内置常量 __{self.name}__['{name}']!")
|
|
753
|
+
raise AttributeError(f"禁止修改内置常量 __{self.name}__['{name}']")
|
|
754
|
+
except:pass
|
|
755
|
+
finally:super().__setitem__(name, value)
|
|
732
756
|
def __delitem__(self, name):
|
|
733
757
|
if name in self.protected_names:
|
|
734
758
|
print(f"警告:禁止删除内置常量 __builtins__['{name}']!")
|
|
@@ -741,10 +765,12 @@ class ProtectedBuiltinsDict(dict,metaclass=ResurrectMeta):
|
|
|
741
765
|
else:
|
|
742
766
|
del self[name]
|
|
743
767
|
def __getattr__(self, name):
|
|
744
|
-
|
|
745
|
-
return
|
|
746
|
-
|
|
747
|
-
|
|
768
|
+
try:
|
|
769
|
+
return super().__getattribute__(name)
|
|
770
|
+
except AttributeError:
|
|
771
|
+
if name in self:
|
|
772
|
+
return self[name]
|
|
773
|
+
raise AttributeError(f"module 'builtins' has no attribute '{name}'") from None
|
|
748
774
|
def __setattr__(self,name,value):
|
|
749
775
|
try:protected = self.protected_names
|
|
750
776
|
except Exception:protected = self
|
|
@@ -786,18 +812,14 @@ def Ask_BHA(path):
|
|
|
786
812
|
temp = mm.read().decode('utf-8').strip()
|
|
787
813
|
temp = temp.split()
|
|
788
814
|
temp2 = lambda x: BoolHybridArr(
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
)
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
)
|
|
797
|
-
n := int(x, base=16),
|
|
798
|
-
lead_zero := len(x) - len(x.lstrip('0')),
|
|
799
|
-
total_len := lead_zero + (n.bit_length() if n != 0 else 1)
|
|
800
|
-
)else None
|
|
815
|
+
(
|
|
816
|
+
bit_stream := bytes(0 if k < lead_zero else (n >> ((total_len - 1) - k)) & 1 for k in range(total_len)),
|
|
817
|
+
arr := array.array('B', FalsesArray(total_len)),
|
|
818
|
+
memcpy(arr.buffer_info()[0], bit_stream, total_len),arr)[-1]
|
|
819
|
+
if(n := int(x, base=16),
|
|
820
|
+
lead_zero := len(x) - len(x.lstrip('0')),
|
|
821
|
+
total_len := lead_zero + (n.bit_length() if n else 1))
|
|
822
|
+
else array.array('B'))
|
|
801
823
|
temp = BHA_List(map(temp2,temp))
|
|
802
824
|
if len(temp) == 1:
|
|
803
825
|
return temp[0]
|
{bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array/int_array/__init__.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
1
2
|
from __future__ import annotations
|
|
2
3
|
from ..core import *
|
|
3
4
|
import builtins
|
|
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'"
|
|
@@ -80,7 +80,7 @@ class IntHybridArray(BoolHybridArray):
|
|
|
80
80
|
block_end = block_start + self.bit_length
|
|
81
81
|
if block_end > self.size:
|
|
82
82
|
raise IndexError("索引超出范围")
|
|
83
|
-
bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
|
|
83
|
+
bit_chunk = [super(self.__class__, self).__getitem__(j) for j in range(block_start, block_end)]
|
|
84
84
|
num = self.to_int(bit_chunk)
|
|
85
85
|
result.append(num)
|
|
86
86
|
return IntHybridArray(result, self.bit_length)
|
|
@@ -91,7 +91,7 @@ class IntHybridArray(BoolHybridArray):
|
|
|
91
91
|
block_end = block_start + self.bit_length
|
|
92
92
|
if block_end > self.size:
|
|
93
93
|
raise IndexError("索引超出范围")
|
|
94
|
-
bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
|
|
94
|
+
bit_chunk = [super(self.__class__, self).__getitem__(j) for j in range(block_start, block_end)]
|
|
95
95
|
return self.to_int(bit_chunk)
|
|
96
96
|
|
|
97
97
|
def __setitem__(self, key, value):
|
|
@@ -145,14 +145,10 @@ class IntHybridArray(BoolHybridArray):
|
|
|
145
145
|
carry = 0 if num_bits[j] else 1
|
|
146
146
|
bool_data = [sign_bit] + num_bits
|
|
147
147
|
for bit_idx in range(self.bit_length):
|
|
148
|
-
super().__setitem__(block_start + bit_idx, bool_data[bit_idx])
|
|
148
|
+
super(self.__class__, self).__setitem__(block_start + bit_idx, bool_data[bit_idx])
|
|
149
149
|
|
|
150
150
|
def __iter__(self):
|
|
151
|
-
|
|
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)
|
|
151
|
+
return map(self.__getitem__,range(len(self)))
|
|
156
152
|
|
|
157
153
|
def __str__(self):
|
|
158
154
|
return f"IntHybridArray([{', '.join(map(str, self))}])"
|
|
@@ -173,7 +169,7 @@ class IntHybridArray(BoolHybridArray):
|
|
|
173
169
|
def index(self, value):
|
|
174
170
|
value = int(value)
|
|
175
171
|
x = f"{value} 不在 IntHybridArray 中"
|
|
176
|
-
for idx in range(len(self)+
|
|
172
|
+
for idx in range(len(self)+1>>1):
|
|
177
173
|
if self[idx] == value:
|
|
178
174
|
return idx
|
|
179
175
|
elif self[-idx] == value:
|
|
@@ -184,7 +180,7 @@ class IntHybridArray(BoolHybridArray):
|
|
|
184
180
|
def rindex(self, value):
|
|
185
181
|
value = int(value)
|
|
186
182
|
x = f"{value} 不在 IntHybridArray 中"
|
|
187
|
-
for idx in range(len(self)+
|
|
183
|
+
for idx in range(len(self)+1>>1):
|
|
188
184
|
if self[-idx] == value:
|
|
189
185
|
return -idx
|
|
190
186
|
elif self[idx] == value:
|
|
@@ -200,4 +196,5 @@ class IntHybridArray(BoolHybridArray):
|
|
|
200
196
|
len_ = len(iterable)
|
|
201
197
|
self.total_bits += len_*self.bit_length
|
|
202
198
|
for i,j in zip(range(len_),iterable):
|
|
203
|
-
self[-i-1] = j
|
|
199
|
+
self[-i-1] = j
|
|
200
|
+
__all__ = list(globals())
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: bool-hybrid-array
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.11.0
|
|
4
4
|
Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
|
|
5
5
|
Home-page: https://github.com/BKsell/bool-hybrid-array
|
|
6
6
|
Author: 蔡靖杰
|
|
@@ -17,6 +17,8 @@ Classifier: Programming Language :: Python :: 3.11
|
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.14
|
|
20
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
21
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
20
22
|
Classifier: License :: OSI Approved :: MIT License
|
|
21
23
|
Classifier: Operating System :: OS Independent
|
|
22
24
|
Requires-Python: >=3.8
|
|
@@ -571,6 +573,12 @@ except OverflowError as e:
|
|
|
571
573
|
* **9.10.19**:和9.10.18.post4相同,正式版本发布
|
|
572
574
|
* **9.10.20**:优化性能,增加BHA_jit_log日志
|
|
573
575
|
* **9.10.21**:优化Ask_BHA,移除BHA_jit_log日志
|
|
576
|
+
* **9.10.22**:进一步优化Ask_BHA的性能
|
|
577
|
+
* **9.11.0**:新增对7.3.10以上的版本的PyPy解释器的支持
|
|
578
|
+
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
|
|
574
582
|
|
|
575
583
|
|
|
576
584
|
## **彩蛋:**
|
|
@@ -585,7 +593,11 @@ except OverflowError as e:
|
|
|
585
593
|
* A:BoolHybridArray是本库中的**核心类**,所有函数都是围绕他进行的,但需要`split_index`,`size`,`is_sparse`;
|
|
586
594
|
BoolHybridArr是一个**函数**,用于把一个可迭代对象转为`BoolHybridArray`类
|
|
587
595
|
* Q:为什么不建议把太大的本类型数组打印?
|
|
588
|
-
* A
|
|
596
|
+
* A:虽然BoolHybridArray类型数组省内存,但字符串不省内存,一个`True`要4字节,一个`False`要5字节,连逗号都要占1字节(`numpy.ndarray`:我都比字符串省内存)
|
|
597
|
+
- Q:为什么使用在Windows终端使用PyPy时建议先调用`chcp 65001`再启动PyPy?
|
|
598
|
+
* A:因为本库有很多的的中文报错和打印,项目里也可能会有。Windows终端里的PyPy默认是GBK编码,有中文时会乱码。chcp 65001可以切换到UTF-8编码,防止乱码。
|
|
599
|
+
|
|
600
|
+
|
|
589
601
|
|
|
590
602
|
## 源代码和原理
|
|
591
603
|
|
|
@@ -8,7 +8,7 @@ def get_long_description():
|
|
|
8
8
|
return "一个高效的布尔数组(密集+稀疏混合存储,节省内存)"
|
|
9
9
|
setup(
|
|
10
10
|
name="bool-hybrid-array",
|
|
11
|
-
version="9.
|
|
11
|
+
version="9.11.0",
|
|
12
12
|
author="蔡靖杰",
|
|
13
13
|
extras_require={"int_array":[]},
|
|
14
14
|
author_email="1289270215@qq.com",
|
|
@@ -27,11 +27,13 @@ setup(
|
|
|
27
27
|
'Programming Language :: Python :: 3.12',
|
|
28
28
|
'Programming Language :: Python :: 3.13',
|
|
29
29
|
'Programming Language :: Python :: 3.14',
|
|
30
|
+
'Programming Language :: Python :: Implementation :: CPython',
|
|
31
|
+
'Programming Language :: Python :: Implementation :: PyPy',
|
|
30
32
|
"License :: OSI Approved :: MIT License",
|
|
31
33
|
"Operating System :: OS Independent",
|
|
32
34
|
],
|
|
33
35
|
keywords="boolean array, compact storage",
|
|
34
|
-
package_data={"": ["README.md", "LICENSE",'temp.py', 'temp.cmd','BHA_Opener.zip'],"bool_hybrid_array":["*"]},
|
|
36
|
+
package_data={"": ["README.md", "LICENSE",'temp.py', 'temp.cmd','BHA_Opener.zip'],"bool_hybrid_array":["*"],"bool_hybrid_array/__pycache__":['*.pyc']},
|
|
35
37
|
include_package_data=True,
|
|
36
38
|
url="https://github.com/BKsell/bool-hybrid-array",
|
|
37
39
|
project_urls={
|
|
File without changes
|
|
File without changes
|
{bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array.egg-info/requires.txt
RENAMED
|
File without changes
|
{bool_hybrid_array-9.10.21 → bool_hybrid_array-9.11.0}/bool_hybrid_array.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|