90 lines
2.9 KiB
Python
Executable File
90 lines
2.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""Quick verification that concurrent scanner execution works."""
|
||
import time
|
||
import copy
|
||
from tradingagents.default_config import DEFAULT_CONFIG
|
||
from tradingagents.graph.discovery_graph import DiscoveryGraph
|
||
|
||
|
||
def compare_execution_modes():
|
||
"""Compare concurrent vs sequential execution."""
|
||
|
||
print("\n" + "="*60)
|
||
print("Concurrent Scanner Execution Verification")
|
||
print("="*60)
|
||
|
||
# Test 1: Concurrent execution
|
||
print("\n1️⃣ Testing CONCURRENT execution...")
|
||
config_concurrent = copy.deepcopy(DEFAULT_CONFIG)
|
||
config_concurrent["discovery"]["scanner_execution"] = {
|
||
"concurrent": True,
|
||
"max_workers": 8,
|
||
"timeout_seconds": 30,
|
||
}
|
||
|
||
graph_concurrent = DiscoveryGraph(config_concurrent)
|
||
state = {
|
||
"trade_date": "2026-02-05",
|
||
"tickers": [],
|
||
"tool_logs": [],
|
||
}
|
||
|
||
start = time.time()
|
||
result_concurrent = graph_concurrent.scanner_node(state)
|
||
time_concurrent = time.time() - start
|
||
|
||
print(f"\n ⏱️ Concurrent time: {time_concurrent:.2f}s")
|
||
print(f" 📊 Candidates found: {len(result_concurrent['candidate_metadata'])}")
|
||
|
||
# Test 2: Sequential execution
|
||
print("\n2️⃣ Testing SEQUENTIAL execution...")
|
||
config_sequential = copy.deepcopy(DEFAULT_CONFIG)
|
||
config_sequential["discovery"]["scanner_execution"] = {
|
||
"concurrent": False,
|
||
"max_workers": 1,
|
||
"timeout_seconds": 30,
|
||
}
|
||
|
||
graph_sequential = DiscoveryGraph(config_sequential)
|
||
state = {
|
||
"trade_date": "2026-02-05",
|
||
"tickers": [],
|
||
"tool_logs": [],
|
||
}
|
||
|
||
start = time.time()
|
||
result_sequential = graph_sequential.scanner_node(state)
|
||
time_sequential = time.time() - start
|
||
|
||
print(f"\n ⏱️ Sequential time: {time_sequential:.2f}s")
|
||
print(f" 📊 Candidates found: {len(result_sequential['candidate_metadata'])}")
|
||
|
||
# Compare
|
||
improvement = ((time_sequential - time_concurrent) / time_sequential) * 100
|
||
|
||
print("\n" + "="*60)
|
||
print("📊 Performance Comparison")
|
||
print("="*60)
|
||
print(f"Concurrent: {time_concurrent:.2f}s ({len(result_concurrent['tickers'])} tickers)")
|
||
print(f"Sequential: {time_sequential:.2f}s ({len(result_sequential['tickers'])} tickers)")
|
||
print(f"Improvement: {improvement:.1f}% faster ⚡")
|
||
print("="*60)
|
||
|
||
return {
|
||
"concurrent_time": time_concurrent,
|
||
"sequential_time": time_sequential,
|
||
"improvement_pct": improvement,
|
||
"concurrent_candidates": len(result_concurrent['candidate_metadata']),
|
||
"sequential_candidates": len(result_sequential['candidate_metadata']),
|
||
}
|
||
|
||
|
||
if __name__ == "__main__":
|
||
results = compare_execution_modes()
|
||
|
||
# Verify improvement
|
||
if results["improvement_pct"] > 15:
|
||
print(f"\n✅ SUCCESS: Concurrent execution is {results['improvement_pct']:.1f}% faster!")
|
||
else:
|
||
print(f"\n⚠️ WARNING: Only {results['improvement_pct']:.1f}% improvement")
|