2010-12-28 27 views
21

Tôi đã từng sử dụng một hồ sơ tốt của Apple được tích hợp vào ứng dụng Màn hình Hệ thống. Miễn là mã C++ của bạn được biên dịch với thông tin gỡ rối, bạn có thể lấy mẫu ứng dụng đang chạy và nó sẽ in ra một cây thụt lề cho bạn biết phần trăm thời gian của hàm cha đã được sử dụng trong hàm này (và so với các hàm khác) .Làm thế nào bạn có thể nhận được cây gọi với trình biên dịch python?

Ví dụ, nếu chính gọi function_1function_2, function_2 cuộc gọi function_3, và sau đó các cuộc gọi chính function_3:

main (100%, 1% in function body): 
    function_1 (9%, 9% in function body): 
    function_2 (90%, 85% in function body): 
     function_3 (100%, 100% in function body) 
    function_3 (1%, 1% in function body) 

tôi sẽ thấy điều này và nghĩ rằng, "Một cái gì đó đang tiến hành một thời gian dài trong các mã trong cơ thể của function_2. Nếu tôi muốn chương trình của tôi nhanh hơn, đó là nơi tôi nên bắt đầu. "

Có ai biết cách tôi có thể dễ dàng có được kết quả đầu ra chính xác nhất cho chương trình python không?

Tôi đã nhìn thấy mọi người nói để làm điều này:

import cProfile, pstats 
prof = cProfile.Profile() 
prof = prof.runctx("real_main(argv)", globals(), locals()) 
stats = pstats.Stats(prof) 
stats.sort_stats("time") # Or cumulative 
stats.print_stats(80) # 80 = how many to print 

nhưng nó khá lộn xộn so với cây gọi tao nhã. Xin vui lòng cho tôi biết nếu bạn có thể dễ dàng làm điều này, nó sẽ giúp khá nhiều.

Chúc mừng!

Trả lời

9

Khám phá thư viện này http://pycallgraph.slowchop.com/ để biết đồ thị cuộc gọi. Nó hoạt động thực sự tốt. Nếu bạn muốn cấu hình các chức năng cụ thể, hãy xem http://mg.pov.lt/blog/profiling.html

Đây là kết quả từ mô-đun cấu hình.

alt text

+0

Bạn có biết nếu gói này có thể làm thời gian cũng như số lượng cuộc gọi chức năng trôi qua? Ví dụ, tôi sẽ không nhớ gọi __hash __() hàng ngàn lần, nhưng gọi sắp xếp() nhiều lần trong danh sách lớn có thể khá chậm. – user

+0

Bạn chỉ nên thử cả hai. Về cơ bản, chúng thực hiện tương tự theo các cách khác nhau với các kết quả đầu ra khác nhau. – Falmarri

+0

+1, gói này nằm dọc theo những gì tôi nghĩ đến và đã nhanh chóng và dễ dàng cài đặt và gọi. Bạn có phiền nói với tôi làm thế nào bạn có được con số trên? Tôi đã làm một đồ thị (sử dụng pycallgraph.start_trace() và pycallgraph.make_dot_graph ('test.jpg', format = 'jpg', tool = 'neato') ), nhưng nó quá đông đúc và rất nhiều chức năng bị che khuất. – user

15

thời gian gần đây tôi muốn điều tương tự, vì vậy mất một đâm vào thực hiện một bản thân mình.

Dự án trên Github. https://github.com/joerick/pyinstrument

Đây là cách bạn sẽ sử dụng nó:

from pyinstrument import Profiler 

profiler = Profiler() 
profiler.start() 

# code you want to profile 

profiler.stop() 

print(profiler.output_text()) 
+1

Điều này thật tuyệt vời, cảm ơn bạn! – Maximilian

+0

Nó có vẻ tốt đẹp, đây là một trong đó là nhiều hơn một thư viện chung: https://github.com/vmprof/vmprof-python – dashesy

+1

Điều này thực sự mát mẻ, cảm ơn bạn! – Dakkaron

38

Tôi chỉ cần stumbled trên này là tốt, và dành thời gian tìm hiểu làm thế nào để tạo ra một đồ thị cuộc gọi (kết quả bình thường của cProfile không phải là terribly thông tin). Tài liệu tham khảo trong tương lai, đây là một cách khác để tạo ra hình ảnh cây cuộc gọi đẹp với cProfile + gprof2dot + graphViz.

-------

  1. Install GraphViz: http://www.graphviz.org/Download_macos.php
  2. easy_install gprof2dot
  3. hồ sơ Run trên mã.

    python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ... 
    
  4. Run gprof2dot để chuyển đổi hồ sơ cá nhân gọi vào một dấu chấm tập tin

    gprof2dot -f pstats myLog.profile -o callingGraph.dot 
    
  5. Open with Graphviz để hình dung đồ thị

Đây là những gì kết quả cuối cùng sẽ như thế nào! Đồ thị có màu đỏ mã hóa nghĩa là nồng độ thời gian cao hơn.

Graph is color-coded- red means higher concentration of time

+4

[xdot] (https://pypi.python.org/pypi/xdot) là trình xem tương tác tuyệt vời cho các tệp .dot cho phép bạn phóng to nội dung. –

+2

Có thể hiển thị tệp .dot trên Unix bằng lệnh shell như "dot callingGraph.dot -Tpng | display" thay cho bước 5. – benjimin

+1

Câu trả lời hay, chính xác những gì tôi đang tìm kiếm, cảm ơn! –

Các vấn đề liên quan