From c6d3deea365f62d83a1c9d967eff00eafa2af3e0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@ericsson.com>
Date: Thu, 4 Apr 2024 15:10:41 +0200
Subject: [PATCH] faster CoolAMQP

---
 CHANGELOG.md                                     |  3 ++-
 coolamqp/attaches/consumer.py                    | 12 ++++++------
 coolamqp/attaches/declarer.py                    |  5 ++---
 coolamqp/attaches/utils.py                       |  6 +++---
 coolamqp/clustering/cluster.py                   |  2 +-
 coolamqp/framing/compilation/content_property.py |  4 ++--
 coolamqp/framing/compilation/textcode_fields.py  | 10 +++++-----
 coolamqp/objects.py                              |  4 ++--
 coolamqp/uplink/handshake.py                     |  2 +-
 coolamqp/uplink/listener/epoll_listener.py       |  3 +--
 coolamqp/uplink/listener/socket.py               | 10 +++++-----
 11 files changed, 30 insertions(+), 31 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index ee83991..4a1d0f5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,4 +4,5 @@ have been made so far, between releases.
 
 # v1.3.1
 
-* coolamqp.objects.Callable made threadsafe (fixes #22)
\ No newline at end of file
+* coolamqp.objects.Callable made threadsafe (fixes #22)
+* speed up (lots of if len(data) == 0 replaced with if not data)
diff --git a/coolamqp/attaches/consumer.py b/coolamqp/attaches/consumer.py
index d597b89..00fbeb3 100644
--- a/coolamqp/attaches/consumer.py
+++ b/coolamqp/attaches/consumer.py
@@ -551,7 +551,7 @@ class MessageReceiver(object):
         :return: callable/0
         """
 
-        def callable():
+        def clbl():
             if self.state == 3:
                 return  # Gone!
 
@@ -566,7 +566,7 @@ class MessageReceiver(object):
             else:
                 self.consumer.method(BasicReject(delivery_tag, True))
 
-        return callable
+        return clbl
 
     def on_head(self, frame):
         assert self.state == 1
@@ -574,13 +574,13 @@ class MessageReceiver(object):
         self.message_size = self.data_to_go = frame.body_size
         self.state = 2
 
-        if self.header.body_size == 0:
+        if not self.header.body_size:
             # An empty message is no common guest. It won't have a BODY field
             #  though...
             self.on_body(EMPTY_MEMORYVIEW)  # trigger it manually
 
     def on_basic_deliver(self, payload):
-        assert self.state == 0
+        assert not self.state
         self.bdeliver = payload
         self.state = 1
 
@@ -597,7 +597,7 @@ class MessageReceiver(object):
                 self.offset += len(payload)
             else:
                 # new one
-                if self.data_to_go == 0:  # special case - single frame message
+                if not self.data_to_go:  # special case - single frame message
                     self.body = payload
                 else:
                     self.body = memoryview(bytearray(self.message_size))
@@ -609,7 +609,7 @@ class MessageReceiver(object):
 
         assert self.data_to_go >= 0
 
-        if self.data_to_go == 0:
+        if not self.data_to_go:
             ack_expected = not self.consumer.no_ack
 
             # Message A-OK!
diff --git a/coolamqp/attaches/declarer.py b/coolamqp/attaches/declarer.py
index ace6b99..e308deb 100644
--- a/coolamqp/attaches/declarer.py
+++ b/coolamqp/attaches/declarer.py
@@ -297,7 +297,7 @@ class Declarer(Channeler, Synchronized):
 
         if persistent:
             if obj not in self.declared:
-                self.declared.add(obj)  # todo access not threadsafe
+                self.declared.add(obj)
 
         self.left_to_declare.append(Operation(self, obj, fut, span, enqueued_span))
         self._do_operations()
@@ -311,8 +311,7 @@ class Declarer(Channeler, Synchronized):
 
         To be called when it's possible that something can be done
         """
-        if (self.state != ST_ONLINE) or len(self.left_to_declare) == 0 or (
-                self.in_process is not None):
+        if self.state != ST_ONLINE or not len(self.left_to_declare) or self.in_process is not None:
             return
 
         self.in_process = self.left_to_declare.popleft()
diff --git a/coolamqp/attaches/utils.py b/coolamqp/attaches/utils.py
index b331cd6..33dbfdf 100644
--- a/coolamqp/attaches/utils.py
+++ b/coolamqp/attaches/utils.py
@@ -124,11 +124,11 @@ class AtomicTagger(object):
                     if you put something that isn't a ConfirmableRejectable, you won't get bitten
                     until you call .ack() or .nack().
         """
-        assert tag >= 0
+        assert tag
         opt = (tag, obj, span)
 
         with self.lock:
-            if len(self.tags) == 0:
+            if not self.tags:
                 self.tags.append(opt)
             elif self.tags[-1][0] < tag:
                 self.tags.append(opt)
@@ -154,7 +154,7 @@ class AtomicTagger(object):
             start = 0
             # start and stop will signify the PYTHON SLICE parameters
 
-            if tag > 0:
+            if tag:
 
                 if multiple:
                     # Compute the ranges
diff --git a/coolamqp/clustering/cluster.py b/coolamqp/clustering/cluster.py
index 2ef2d96..de021c5 100644
--- a/coolamqp/clustering/cluster.py
+++ b/coolamqp/clustering/cluster.py
@@ -147,7 +147,7 @@ class Cluster(object):
 
         def fetch():
             try:
-                if timeout == 0:
+                if not timeout:
                     return self.events.get_nowait()
                 else:
                     return self.events.get(True, timeout)
diff --git a/coolamqp/framing/compilation/content_property.py b/coolamqp/framing/compilation/content_property.py
index a6f33df..0149db2 100644
--- a/coolamqp/framing/compilation/content_property.py
+++ b/coolamqp/framing/compilation/content_property.py
@@ -91,7 +91,7 @@ def _compile_particular_content_property_list_class(zpf, fields):
 
     mod.append(SPACER)
 
-    if len(present_fields) == 0:
+    if not len(present_fields):
         slots = u''
     else:
         slots = (u', '.join(
@@ -104,7 +104,7 @@ def _compile_particular_content_property_list_class(zpf, fields):
 
     FFN = u', '.join(format_field_name(field.name) for field in present_fields)
 
-    if len(present_fields) > 0:
+    if len(present_fields):
         mod.append(INIT_I % (FFN,))
 
     for field in present_fields:
diff --git a/coolamqp/framing/compilation/textcode_fields.py b/coolamqp/framing/compilation/textcode_fields.py
index 0d5ea0f..393b45b 100644
--- a/coolamqp/framing/compilation/textcode_fields.py
+++ b/coolamqp/framing/compilation/textcode_fields.py
@@ -94,7 +94,7 @@ def get_from_buffer(fields, prefix='', indent_level=2, remark=False):
     to_struct = []
 
     def emit_bits():
-        if len(bits) == 0:
+        if not len(bits):
             return
         if remark:
             print('Bits are being banged')
@@ -115,7 +115,7 @@ def get_from_buffer(fields, prefix='', indent_level=2, remark=False):
     def emit_structures(dont_do_bits=False):  # type: (bool) -> dict
         if not dont_do_bits:
             emit_bits()
-        if len(to_struct) == 0:
+        if not len(to_struct):
             return {}
         fffnames = [a for a, b in to_struct if a != u'_']  # skip reserved
         ffffmts = [b for a, b in to_struct]
@@ -141,7 +141,7 @@ def get_from_buffer(fields, prefix='', indent_level=2, remark=False):
         if BASIC_TYPES[field.basic_type][0] is not None:
             # static type shit has
 
-            assert len(bits) == 0
+            assert not len(bits)
 
             if field.reserved:
                 to_struct.append(
@@ -155,8 +155,8 @@ def get_from_buffer(fields, prefix='', indent_level=2, remark=False):
         elif field.basic_type == u'table':  # oh my god
             structers.update(emit_structures())
 
-            assert len(bits) == 0
-            assert len(to_struct) == 0
+            assert not len(bits)
+            assert not len(to_struct)
 
             emit("%s, delta = deframe_table(buf, offset)", fieldname)
             emit("offset += delta")
diff --git a/coolamqp/objects.py b/coolamqp/objects.py
index b396d35..5949d9c 100644
--- a/coolamqp/objects.py
+++ b/coolamqp/objects.py
@@ -251,8 +251,8 @@ class Queue(object):
         self.auto_delete = auto_delete
         self.exclusive = exclusive
 
-        self.anonymous = len(
-            self.name) == 0  # if this queue is anonymous, it must be regenerated upon reconnect
+        self.anonymous = not len(
+            self.name)  # if this queue is anonymous, it must be regenerated upon reconnect
 
         self.consumer_tag = self.name if not self.anonymous else uuid.uuid4().hex.encode(
             'utf8')  # bytes, consumer tag to use in AMQP comms
diff --git a/coolamqp/uplink/handshake.py b/coolamqp/uplink/handshake.py
index dfa6e25..163c099 100644
--- a/coolamqp/uplink/handshake.py
+++ b/coolamqp/uplink/handshake.py
@@ -120,7 +120,7 @@ class Handshaker(object):
         self.connection.frame_max = payload.frame_max
         self.connection.heartbeat = min(payload.heartbeat, self.heartbeat)
         self.connection.free_channels.extend(six.moves.xrange(1, (
-            65535 if payload.channel_max == 0 else payload.channel_max) + 1))
+            65535 if not payload.channel_max else payload.channel_max) + 1))
 
         self.connection.watch_for_method(0, ConnectionOpenOk,
                                          self.on_connection_open_ok)
diff --git a/coolamqp/uplink/listener/epoll_listener.py b/coolamqp/uplink/listener/epoll_listener.py
index e84e5d0..d164fbf 100644
--- a/coolamqp/uplink/listener/epoll_listener.py
+++ b/coolamqp/uplink/listener/epoll_listener.py
@@ -74,8 +74,7 @@ class EpollListener(BaseListener):
                 if event & select.EPOLLOUT:
                     sock.on_write()
                     # I'm done with sending for now
-                    if len(sock.data_to_send) == 0 and len(
-                            sock.priority_queue) == 0:
+                    if not len(sock.data_to_send) and not len(sock.priority_queue):
                         self.epoll.modify(sock.fileno(), RO)
 
             except SocketFailed as e:
diff --git a/coolamqp/uplink/listener/socket.py b/coolamqp/uplink/listener/socket.py
index d149e17..afc9198 100644
--- a/coolamqp/uplink/listener/socket.py
+++ b/coolamqp/uplink/listener/socket.py
@@ -100,7 +100,7 @@ class BaseSocket(object):
         except (IOError, socket.error) as e:
             raise SocketFailed(repr(e))
 
-        if len(data) == 0:
+        if not data:
             raise SocketFailed('connection gracefully closed')
 
         try:
@@ -109,7 +109,7 @@ class BaseSocket(object):
             raise SocketFailed(repr(e))
 
     def wants_to_send_data(self):  # type: () -> bool
-        return not (len(self.data_to_send) == 0 and len(self.priority_queue) == 0)
+        return not (not self.data_to_send and not self.priority_queue)
 
     def on_write(self):      # type: () -> None
         """
@@ -123,8 +123,8 @@ class BaseSocket(object):
             return False
 
         while True:
-            if len(self.data_to_send) == 0:
-                if len(self.priority_queue) == 0:
+            if not self.data_to_send:
+                if not self.priority_queue:
                     return True
                 else:
                     self.data_to_send.appendleft(self.priority_queue.popleft())
@@ -147,7 +147,7 @@ class BaseSocket(object):
                 # Looks like everything has been sent
                 self.data_to_send.popleft()  # mark as sent
 
-                if len(self.priority_queue) > 0:
+                if self.priority_queue:
                     # We can send a priority pack
                     self.data_to_send.appendleft(self.priority_queue.popleft())
 
-- 
GitLab