Skip to content

Commit c449bf7

Browse files
hongweipengbrandtbucher
authored and
Jake Taylor
committed
bpo-38045: Improve the performance of _decompose() in enum.py (pythonGH-16483)
* Improve the performance of _decompose() in enum.py Co-Authored-By: Brandt Bucher <brandtbucher@gmail.com>
1 parent c623ffb commit c449bf7

File tree

2 files changed

+11
-23
lines changed

2 files changed

+11
-23
lines changed

Lib/enum.py

+10-23
Original file line numberDiff line numberDiff line change
@@ -861,37 +861,24 @@ def _decompose(flag, value):
861861
# _decompose is only called if the value is not named
862862
not_covered = value
863863
negative = value < 0
864-
# issue29167: wrap accesses to _value2member_map_ in a list to avoid race
865-
# conditions between iterating over it and having more pseudo-
866-
# members added to it
867-
if negative:
868-
# only check for named flags
869-
flags_to_check = [
870-
(m, v)
871-
for v, m in list(flag._value2member_map_.items())
872-
if m.name is not None
873-
]
874-
else:
875-
# check for named flags and powers-of-two flags
876-
flags_to_check = [
877-
(m, v)
878-
for v, m in list(flag._value2member_map_.items())
879-
if m.name is not None or _power_of_two(v)
880-
]
881864
members = []
882-
for member, member_value in flags_to_check:
865+
for member in flag:
866+
member_value = member.value
883867
if member_value and member_value & value == member_value:
884868
members.append(member)
885869
not_covered &= ~member_value
870+
if not negative:
871+
tmp = not_covered
872+
while tmp:
873+
flag_value = 2 ** _high_bit(tmp)
874+
if flag_value in flag._value2member_map_:
875+
members.append(flag._value2member_map_[flag_value])
876+
not_covered &= ~flag_value
877+
tmp &= ~flag_value
886878
if not members and value in flag._value2member_map_:
887879
members.append(flag._value2member_map_[value])
888880
members.sort(key=lambda m: m._value_, reverse=True)
889881
if len(members) > 1 and members[0].value == value:
890882
# we have the breakdown, don't need the value member itself
891883
members.pop(0)
892884
return members, not_covered
893-
894-
def _power_of_two(value):
895-
if value < 1:
896-
return False
897-
return value == 2 ** _high_bit(value)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improve the performance of :func:`enum._decompose` in :mod:`enum`. Patch by hongweipeng.

0 commit comments

Comments
 (0)