aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRapptz <[email protected]>2019-05-29 01:22:36 -0400
committerRapptz <[email protected]>2019-05-29 01:22:53 -0400
commit00a0856cc44549a29d5123b997db3a5e593f0896 (patch)
tree48071f9464b906b2a39470e31a5013791f8c4da9
parentSpeed-up utils.get for the common cases (diff)
downloaddiscord.py-00a0856cc44549a29d5123b997db3a5e593f0896.tar.xz
discord.py-00a0856cc44549a29d5123b997db3a5e593f0896.zip
Use a dict instead of getattr for parsing events.
Probably not a significant difference but might as well use it here. The basic idea is to cache the getattr calls instead of repeatedly doing it (since they're around 105ns on my machine). The dictionary lookup is about 41ns on my machine. The next step in speeding up library code some more should be in the parser bodies themselves but that's a problem to tackle another day.
-rw-r--r--discord/gateway.py7
-rw-r--r--discord/shard.py1
-rw-r--r--discord/state.py6
3 files changed, 10 insertions, 4 deletions
diff --git a/discord/gateway.py b/discord/gateway.py
index bf51377f..aa2c02ee 100644
--- a/discord/gateway.py
+++ b/discord/gateway.py
@@ -227,6 +227,7 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
# dynamically add attributes needed
ws.token = client.http.token
ws._connection = client._connection
+ ws._discord_parsers = client._connection.parsers
ws._dispatch = client.dispatch
ws.gateway = gateway
ws.shard_id = shard_id
@@ -414,11 +415,9 @@ class DiscordWebSocket(websockets.client.WebSocketClientProtocol):
log.info('Shard ID %s has successfully RESUMED session %s under trace %s.',
self.shard_id, self.session_id, ', '.join(trace))
- parser = 'parse_' + event.lower()
-
try:
- func = getattr(self._connection, parser)
- except AttributeError:
+ func = self._discord_parsers[event]
+ except KeyError:
log.warning('Unknown event %s.', event)
else:
func(data)
diff --git a/discord/shard.py b/discord/shard.py
index a5f5f541..331d174b 100644
--- a/discord/shard.py
+++ b/discord/shard.py
@@ -221,6 +221,7 @@ class AutoShardedClient(Client):
ws.token = self.http.token
ws._connection = self._connection
+ ws._discord_parsers = self._connection.parsers
ws._dispatch = self.dispatch
ws.gateway = gateway
ws.shard_id = shard_id
diff --git a/discord/state.py b/discord/state.py
index f04d6ee7..d56b9e75 100644
--- a/discord/state.py
+++ b/discord/state.py
@@ -33,6 +33,7 @@ import itertools
import logging
import math
import weakref
+import inspect
from .guild import Guild
from .activity import _ActivityTag
@@ -88,6 +89,11 @@ class ConnectionState:
self._activity = activity
self._status = status
+ self.parsers = parsers = {}
+ for attr, func in inspect.getmembers(self):
+ if attr.startswith('parse_'):
+ parsers[attr[6:].upper()] = func
+
self.clear()
def clear(self):