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.
This commit is contained in:
Rapptz
2018-09-24 22:06:49 -04:00
parent 3d03dbc451
commit 95d8bb2e85
5 changed files with 67 additions and 21 deletions

View File

@ -173,7 +173,8 @@ class Role(Hashable):
if self.is_default():
return all_members
return [member for member in all_members if self in member.roles]
role_id = self.id
return [member for member in all_members if member._roles.has(role_id)]
async def _move(self, position, reason):
if position <= 0: