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
This commit is contained in:
		@@ -482,11 +482,14 @@ class GuildChannel:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        default = self.guild.default_role
 | 
					        default = self.guild.default_role
 | 
				
			||||||
        base = Permissions(default.permissions.value)
 | 
					        base = Permissions(default.permissions.value)
 | 
				
			||||||
        roles = member.roles
 | 
					        roles = member._roles
 | 
				
			||||||
 | 
					        get_role = self.guild.get_role
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Apply guild roles that the member has.
 | 
					        # Apply guild roles that the member has.
 | 
				
			||||||
        for role in roles:
 | 
					        for role_id in roles:
 | 
				
			||||||
            base.value |= role.permissions.value
 | 
					            role = get_role(role_id)
 | 
				
			||||||
 | 
					            if role is not None:
 | 
				
			||||||
 | 
					                base.value |= role._permissions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Guild-wide Administrator -> True for everything
 | 
					        # Guild-wide Administrator -> True for everything
 | 
				
			||||||
        # Bypass all channel-specific overrides
 | 
					        # Bypass all channel-specific overrides
 | 
				
			||||||
@@ -504,19 +507,12 @@ class GuildChannel:
 | 
				
			|||||||
        except IndexError:
 | 
					        except IndexError:
 | 
				
			||||||
            remaining_overwrites = self._overwrites
 | 
					            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
 | 
					        denies = 0
 | 
				
			||||||
        allows = 0
 | 
					        allows = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Apply channel specific role permission overwrites
 | 
					        # Apply channel specific role permission overwrites
 | 
				
			||||||
        for overwrite in remaining_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
 | 
					                denies |= overwrite.deny
 | 
				
			||||||
                allows |= overwrite.allow
 | 
					                allows |= overwrite.allow
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user