Python 3.14 - Complexity & Optimizations¶
Python 3.14 was released October 2025 with new max-heap support and continued performance improvements.
New Features Affecting Complexity¶
Max-Heap Support in heapq¶
Python 3.14 adds native max-heap functions to the heapq module:
import heapq
# New max-heap operations (Python 3.14+)
data = [3, 1, 4, 1, 5, 9, 2, 6]
heapq.heapify_max(data) # O(n) - Transform to max-heap
heapq.heappush_max(data, 10) # O(log n) - Add to max-heap
max_val = heapq.heappop_max(data) # O(log n) - Remove and return max
heapq.heapreplace_max(data, 7) # O(log n) - Pop max, push new
heapq.heappushpop_max(data, 8) # O(log n) - Push, then pop max
# Previously required negation workaround:
# Old: heapq.heappush(heap, -value) # Negate for max-heap
# New: heapq.heappush_max(heap, value) # Direct max-heap
| Operation | Time | Space | Notes |
|---|---|---|---|
heapify_max(x) |
O(n) | O(1) | In-place max-heap transformation |
heappush_max(heap, item) |
O(log n) | O(1) | Add item to max-heap |
heappop_max(heap) |
O(log n) | O(1) | Remove and return max item |
heapreplace_max(heap, item) |
O(log n) | O(1) | Pop max then push |
heappushpop_max(heap, item) |
O(log n) | O(1) | Push then pop max |
New Type Conversion Methods¶
# float.from_number() - O(1)
f = float.from_number(42) # Converts number to float
f = float.from_number(3.14) # Returns float
# complex.from_number() - O(1)
c = complex.from_number(42) # Converts to complex
# Raises TypeError for non-numeric types (stricter than float())
float.from_number("3.14") # TypeError
bytes.fromhex() Enhancement¶
# Now accepts bytes input (previously only str)
data = bytes.fromhex(b"48656c6c6f") # O(n)
data = bytearray.fromhex(b"48656c6c6f") # O(n)
Performance Improvements¶
Incremental Garbage Collection¶
# GC pause times reduced by order of magnitude for large heaps
# No code changes needed - automatic improvement
# Impact: More consistent latency for long-running applications
# Complexity unchanged, but real-world pause times much shorter
asyncio Optimization¶
import asyncio
# 10-20% faster task scheduling
# Per-thread doubly linked list for tasks
# Reduced memory usage
async def main():
tasks = [asyncio.create_task(work()) for _ in range(1000)]
await asyncio.gather(*tasks) # Faster scheduling
uuid Performance¶
import uuid
# uuid3() and uuid5(): ~40% faster for 16-byte names
# uuid4(): ~30% faster
name_uuid = uuid.uuid5(uuid.NAMESPACE_DNS, "example.com")
random_uuid = uuid.uuid4() # 30% faster
zlib on Windows¶
import zlib
# Windows: Now uses zlib-ng for better performance
# All compression levels faster
# Note: Z_BEST_SPEED (level 1) may compress less than before
data = zlib.compress(b"data" * 1000, level=6)
Complexity Characteristics¶
All standard complexities preserved from 3.13:
| Operation | Complexity | Status |
|---|---|---|
list.append() |
O(1) amortized | Unchanged |
dict[key] |
O(1) avg | Unchanged |
set.add() |
O(1) amortized | Unchanged |
heapq.heappush() |
O(log n) | Unchanged |
heapq.heappush_max() |
O(log n) | New |
Deferred Annotation Evaluation (PEP 649)¶
# Annotations no longer evaluated at function definition time
# Reduces import overhead for heavily annotated code
def process(data: list[ComplexType]) -> Result:
pass
# ComplexType not evaluated until annotations accessed
# Reduces memory for unused annotations
Deprecations¶
# Deprecated:
# - calendar.January/February (use calendar.JANUARY/FEBRUARY)
# - codecs.open() (use built-in open())
# - Passing complex as real/imag to complex()
# Pending removal:
# - typing._UnionGenericAlias (Python 3.17)
Recommendations¶
When to Use Max-Heap Functions¶
import heapq
# Use heapify_max() for priority queues needing max first
tasks = [(1, "low"), (5, "high"), (3, "medium")]
heapq.heapify_max(tasks)
urgent = heapq.heappop_max(tasks) # (5, "high")
# Use for top-k smallest (maintain max-heap of k items)
def k_smallest(items, k):
heap = items[:k]
heapq.heapify_max(heap)
for item in items[k:]:
if item < heap[0]:
heapq.heapreplace_max(heap, item)
return sorted(heap)
When to Upgrade¶
Upgrade to 3.14 if: - ✅ Need native max-heap support - ✅ Large heap applications (better GC pauses) - ✅ UUID-heavy workloads - ✅ Windows zlib performance matters
Stay on 3.13 if: - ✅ Production stability priority - ✅ Package compatibility concerns - ✅ Testing free-threading builds
End of Life¶
- Release: October 2025
- Bugfix Support: Until October 2027
- Security Support: Until October 2030