aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2020-08-01 19:48:15 -0400
committerRapptz <[email protected]>2020-08-01 19:48:15 -0400
commit14fd3dbaa792c38d3a4766a8b17ed49c5e3114a0 (patch)
treebbfd5b2bb798c3b18793d900286878d1ef3c3b61
parentTerminate shard processing queue when a clean close is encountered. (diff)
downloaddiscord.py-14fd3dbaa792c38d3a4766a8b17ed49c5e3114a0.tar.xz
discord.py-14fd3dbaa792c38d3a4766a8b17ed49c5e3114a0.zip
Optimize Channel.permissions_for by not creating temporary objects
This seemed to have shaved a few microseconds: 10.8 µs ± 79.6 ns per loop → 8.53 µs ± 48.1 ns per loop 12 µs ± 613 ns per loop → 8.72 µs ± 30.2 ns per loop With 100K loops each
-rw-r--r--discord/abc.py18
1 files changed, 7 insertions, 11 deletions
diff --git a/discord/abc.py b/discord/abc.py
index dbfd3760..7704a5f8 100644
--- a/discord/abc.py
+++ b/discord/abc.py
@@ -482,11 +482,14 @@ class GuildChannel:
default = self.guild.default_role
base = Permissions(default.permissions.value)
- roles = member.roles
+ roles = member._roles
+ get_role = self.guild.get_role
# Apply guild roles that the member has.
- for role in roles:
- base.value |= role.permissions.value
+ for role_id in roles:
+ role = get_role(role_id)
+ if role is not None:
+ base.value |= role._permissions
# Guild-wide Administrator -> True for everything
# Bypass all channel-specific overrides
@@ -504,19 +507,12 @@ class GuildChannel:
except IndexError:
remaining_overwrites = self._overwrites
- # not sure if doing member._roles.get(...) is better than the
- # set approach. While this is O(N) to re-create into a set for O(1)
- # the direct approach would just be O(log n) for searching with no
- # extra memory overhead. For now, I'll keep the set cast
- # Note that the member.roles accessor up top also creates a
- # temporary list
- member_role_ids = {r.id for r in roles}
denies = 0
allows = 0
# Apply channel specific role permission overwrites
for overwrite in remaining_overwrites:
- if overwrite.type == 'role' and overwrite.id in member_role_ids:
+ if overwrite.type == 'role' and roles.has(overwrite.id):
denies |= overwrite.deny
allows |= overwrite.allow