You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编程访问cProfile数据:跨Python2.7/3.5生成性能分析报告问询

Hey there! Let's walk through building a complete performance reporting workflow tailored to your mixed Python 2.7/3.5 setup. You've already got the basics down with cProfile and pStats—here's how to wrap it all up into a polished, end-to-end reporting process:

Complete Performance Reporting Workflow for Mixed Python Versions

1. Optimize cProfile Data Capture (Python 2.7 Side)

You're already writing cProfile data to disk, but let's refine this step for flexibility and compatibility:

  • Disk-based capture (most reliable for cross-version)
    Stick with this if you want to avoid encoding/pipe headaches. In your Python 2.7 script:
    import cProfile
    
    # Run your legacy code and save stats to disk
    cProfile.run('your_legacy_module.main()', 'profile_output.stats')
    
  • Pipe-based capture (avoid disk I/O)
    If you prefer passing data directly to Python 3.5 without writing files, use binary stdout:
    import cProfile
    import sys
    from io import BytesIO
    
    pr = cProfile.Profile()
    pr.enable()
    your_legacy_function()  # Execute your core logic
    pr.disable()
    
    # Write stats to a BytesIO buffer and send to stdout
    buffer = BytesIO()
    pr.dump_stats(buffer)
    sys.stdout.write(buffer.getvalue())
    
    Just make sure your Python 3.5 process reads stdout in binary mode (we'll cover this later).

2. Standardize Data Analysis (Python 3.5 Side)

You're already loading pStats data—let's formalize the analysis to prepare for reporting:

  • Load stats data
    import pstats
    
    # Option 1: Load from disk
    stats = pstats.Stats('profile_output.stats')
    # Option 2: Load from pipe (if using the stdout method above)
    # stats = pstats.Stats(sys.stdin.buffer)
    
  • Clean and filter data
    # Sort by cumulative time (adjust to 'time' for per-call time, or 'calls' for frequency)
    stats.sort_stats(pstats.SortKey.CUMULATIVE)  # Python 3.5 supports SortKey; use 'cumulative' string for full compatibility
    # Filter to only include your legacy modules (exclude system libs)
    stats.filter_paths(['your_legacy_module/', 'legacy_utils.py'])
    
  • Extract key metrics
    Pull structured data for custom reports (e.g., top 10 slowest functions, total runtime):
    total_runtime = stats.total_tt
    top_10_funcs = sorted(stats.stats.items(), key=lambda x: x[1][3], reverse=True)[:10]
    

3. Generate Polished Reports

Console output is great for debugging—here's how to build shareable, professional reports:

3.1 Structured Text Report

Perfect for quick audits or log archives:

with open('performance_summary.txt', 'w') as f:
    f.write(f"Total Runtime: {total_runtime:.2f} seconds\n\n")
    f.write("Top 20 Slowest Functions (Cumulative Time):\n")
    stats.print_stats(20, stream=f)
    f.write("\nFunction Callers:\n")
    stats.print_callers(10, stream=f)

3.2 Interactive HTML Report

Use pyprof2calltree (compatible with Python 3.5) to generate visual, navigable reports:

  1. Install a compatible version: pip install pyprof2calltree==1.4.4
  2. Generate and convert calltree data:
    import pyprof2calltree
    
    # Generate callgrind format data
    pyprof2calltree.convert(stats, 'profile_data.callgrind')
    # Convert to HTML (use tools like kcachegrind's web interface or online converters if needed)
    # Alternatively, use the built-in viewer if your environment supports it
    pyprof2calltree.view(stats)
    
    For full control, you can manually build an HTML report with tables for top functions and runtime breakdowns.

3.3 Visual Charts

Use matplotlib (version 3.0.3 works with Python 3.5) to create intuitive bar charts:

import matplotlib.pyplot as plt

# Extract data for top 10 functions
func_names = [item[0][2] for item in top_10_funcs]
cumulative_times = [item[1][3] for item in top_10_funcs]

# Build horizontal bar chart
plt.figure(figsize=(10, 6))
plt.barh(range(len(func_names)), cumulative_times, color='#4285F4')
plt.yticks(range(len(func_names)), func_names)
plt.xlabel('Cumulative Time (Seconds)')
plt.title('Top 10 Most Time-Consuming Functions')
plt.tight_layout()
plt.savefig('performance_chart.png')

4. Automate the Entire Workflow

Tie everything together in your Python 3.5 process to run reports automatically:

import subprocess
import pstats
import os

# Call Python 2.7 process and capture output
proc = subprocess.Popen(
    ['python2.7', 'your_legacy_script.py'],
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    text=False  # Critical for binary stats data
)
stats_binary, log_output = proc.communicate()

# Save stderr logs
with open('legacy_process.log', 'w') as f:
    f.write(log_output.decode('utf-8'))

# Load and analyze stats
stats = pstats.Stats()
stats.load_stats(stats_binary)
stats.sort_stats('cumulative').filter_paths(['your_legacy_module/'])

# Generate all reports
# Text report
with open('perf_summary.txt', 'w') as f:
    stats.print_stats(20, stream=f)
# HTML/calltree report
import pyprof2calltree
pyprof2calltree.convert(stats, 'perf_data.callgrind')
# Visual chart
# ... (insert matplotlib code from section 3.3)

# Clean up temporary files (if using disk-based capture)
if os.path.exists('profile_output.stats'):
    os.remove('profile_output.stats')

Key Notes

  • Cross-version compatibility: Always test libraries (like pyprof2calltree or matplotlib) with both Python 2.7 and 3.5 to avoid breaking changes.
  • Data integrity: When using pipes, stick to binary mode to prevent encoding corruption of stats data.
  • Report archiving: Zip all output files (text, HTML, chart, logs) into a single archive for easy sharing and storage.

内容的提问来源于stack exchange,提问作者Basic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:50:02