From 95d8bb2e8551e61d1603f588dbed053344fada80 Mon Sep 17 00:00:00 2001 From: Rapptz Date: Mon, 24 Sep 2018 22:06:49 -0400 Subject: Change internal representation of roles in Member and Emoji. Introduce a new internal type, SnowflakeList, which has better memory footprint over a regular list or set of roles. It is suspected that there will be a 9x reduction of memory for every Emoji instance and a 48 byte saving per Member instance. However, these savings will probably only be evident on larger bots. As a consequence of this change, Member.roles is now computed lazily. Currently I am not sure if I want to do the initial sorting on the SnowflakeList for Member, as this comes with a O(n log n) cost when creating a Member for little purpose since SnowflakeList.has is not overly relied on. If CPU time becomes an issue this might change. --- discord/abc.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'discord/abc.py') diff --git a/discord/abc.py b/discord/abc.py index 8482104a..02dc765f 100644 --- a/discord/abc.py +++ b/discord/abc.py @@ -415,9 +415,10 @@ class GuildChannel: default = self.guild.default_role base = Permissions(default.permissions.value) + roles = member.roles # Apply guild roles that the member has. - for role in member.roles: + for role in roles: base.value |= role.permissions.value # Guild-wide Administrator -> True for everything @@ -436,7 +437,13 @@ class GuildChannel: except IndexError: remaining_overwrites = self._overwrites - member_role_ids = set(map(lambda r: r.id, member.roles)) + # 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 -- cgit v1.2.3