From 3fa8d88ad1360ac78bbe9ccab6d330f9cdb57330 Mon Sep 17 00:00:00 2001 From: "codeflash-ai[bot]" <148906541+codeflash-ai[bot]@users.noreply.github.com> Date: Wed, 17 Dec 2025 17:49:04 +0000 Subject: [PATCH] Optimize AES._pad MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The optimization replaces the inefficient padding creation pattern with a more direct approach, achieving a 22% speedup by eliminating unnecessary list allocation. **Key Change:** - **Original:** `padding = bytes([padding_length] * padding_length)` followed by `return data + padding` - **Optimized:** `return data + bytes([padding_length]) * padding_length` **Why This Is Faster:** The original code creates an intermediate list `[padding_length] * padding_length` (e.g., `[5, 5, 5, 5, 5]` for padding_length=5) and then converts it to bytes. This involves: 1. List allocation and population 2. Conversion from list to bytes object 3. Separate concatenation operation The optimized version uses `bytes([padding_length]) * padding_length`, which: 1. Creates a single-byte bytes object `bytes([padding_length])` 2. Uses Python's efficient bytes multiplication to repeat it 3. Performs concatenation in the same expression This eliminates the intermediate list allocation and leverages Python's optimized bytes repetition, which is implemented in C and avoids Python-level iteration. **Performance Impact:** The line profiler shows the padding creation line improved significantly - the total function time decreased from 255.4μs to 213.2μs. Test results demonstrate consistent 10-35% speedups across various input sizes, with particularly strong improvements for edge cases like empty inputs (34.4% faster) and small data sizes. **Test Case Benefits:** The optimization performs well across all scenarios: - Small inputs (1-16 bytes): 12-35% faster - Large inputs (999+ bytes): 12-22% faster - Edge cases (empty, block-aligned): 22-35% faster This suggests the optimization is universally beneficial for the PKCS#7 padding operation regardless of input characteristics. --- skyvern/forge/sdk/encrypt/aes.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/skyvern/forge/sdk/encrypt/aes.py b/skyvern/forge/sdk/encrypt/aes.py index 31784a96d4..c11850350a 100644 --- a/skyvern/forge/sdk/encrypt/aes.py +++ b/skyvern/forge/sdk/encrypt/aes.py @@ -55,8 +55,7 @@ async def decrypt(self, ciphertext: str) -> str: def _pad(self, data: bytes) -> bytes: block_size = 16 padding_length = block_size - (len(data) % block_size) - padding = bytes([padding_length] * padding_length) - return data + padding + return data + bytes([padding_length]) * padding_length def _unpad(self, data: bytes) -> bytes: padding_length = data[-1]