Skip to content

Commit 9be91cb

Browse files
authored
Optimise utils.find and specialise utils.as_chunks
1 parent c342db8 commit 9be91cb

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

discord/abc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ def permissions_for(self, obj: Union[Member, Role], /) -> Permissions:
821821
if obj.is_default():
822822
return base
823823

824-
overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id)
824+
overwrite = utils.find(lambda ow: ow.type == _Overwrites.ROLE and ow.id == obj.id, self._overwrites)
825825
if overwrite is not None:
826826
base.handle_overwrite(overwrite.allow, overwrite.deny)
827827

discord/utils.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@
5656
TYPE_CHECKING,
5757
)
5858
import unicodedata
59+
import collections.abc
60+
from itertools import islice
5961
from base64 import b64encode, b64decode
6062
from bisect import bisect_left
6163
import datetime
@@ -434,7 +436,7 @@ def time_snowflake(dt: datetime.datetime, /, *, high: bool = False) -> int:
434436

435437

436438
def _find(predicate: Callable[[T], Any], iterable: Iterable[T], /) -> Optional[T]:
437-
return next((element for element in iterable if predicate(element)), None)
439+
return next(filter(predicate, iterable), None)
438440

439441

440442
async def _afind(predicate: Callable[[T], Any], iterable: AsyncIterable[T], /) -> Optional[T]:
@@ -1037,17 +1039,18 @@ def escape_mentions(text: str) -> str:
10371039

10381040

10391041
def _chunk(iterator: Iterable[T], max_size: int) -> Iterator[List[T]]:
1040-
ret = []
1041-
n = 0
1042-
for item in iterator:
1043-
ret.append(item)
1044-
n += 1
1045-
if n == max_size:
1046-
yield ret
1047-
ret = []
1048-
n = 0
1049-
if ret:
1050-
yield ret
1042+
# Specialise iterators that can be sliced as it is much faster
1043+
if isinstance(iterator, collections.abc.Sequence):
1044+
for i in range(0, len(iterator), max_size):
1045+
yield list(iterator[i : i + max_size])
1046+
else:
1047+
# Fallback to slower path
1048+
iterator = iter(iterator)
1049+
while True:
1050+
batch = list(islice(iterator, max_size))
1051+
if not batch:
1052+
break
1053+
yield batch
10511054

10521055

10531056
async def _achunk(iterator: AsyncIterable[T], max_size: int) -> AsyncIterator[List[T]]:

0 commit comments

Comments
 (0)