2013-04-18 34 views
5

Tôi đang cố gắng để làm theo hướng dẫn ở đây: http://docs.python.org/2/library/profile.html#module-cProfileLàm thế nào để bạn có được trình biên dịch Python để làm việc?

Cụ thể, phần này:

import cProfile, pstats, io 
pr = cProfile.Profile() 
pr.enable() 
... do something ... 
pr.disable() 
s = io.StringIO() 
ps = pstats.Stats(pr, stream=s) 
ps.print_results() 

tôi đã xác định rằng print_results không phải là một phương pháp thực sự của lớp Thống kê, cũng không nó dường như thực sự tồn tại ở mọi nơi. Đây là mã hiện tại của tôi:

import cProfile, pstats, io 
def foo(request): 
    pr = cProfile.Profile() 
    pr.enable() 
    pass 
    pr.disable() 
    s = io.StringIO() 
    ps = pstats.Stats(pr, stream = s) 
    f = open('/profstats', 'a') 
    ps.print_stats() 
    f.write(s.getvalue()) 
    s.close() 
    f.close() 

kết quả hiện tại là: TypeError tại/kiểm tra-summary/ luận unicode mong đợi, có 'str'

(Output trông như thế này bởi vì tôi đang sử dụng Django để gọi mã được đề cập).

Vì vậy, có ai biết cách tôi có thể nhận được hồ sơ để thực sự, tốt, làm việc? Tôi chỉ muốn nó để hồ sơ như nó được cho là, sau đó in kết quả vào một tập tin để tôi có thể xem kết quả sau này sau khi thực hiện. Tôi có thể nhận được dump_stats để làm việc, nhưng tập tin nó tạo ra là rác.

Trả lời

6

Thật vậy, API của mô-đun hồ sơ/pstats trông khá đặc biệt. Tôi nghĩ rằng dòng ps.print_results() được coi là một cái chung, tức là nó phải được viết là ps.call_some_methods_to_print_the_result(), nhưng điều này không rõ ràng. Đối với dump_stats() nó thực sự lưu một tệp nhị phân có thể được tải lại sau.

Dưới đây là một ví dụ mà làm việc cho tôi:

import cProfile, pstats 
pr = cProfile.Profile() 
pr.enable() 
... 
pr.disable() 

f = open('x.prof', 'a') 
sortby = 'cumulative' 
pstats.Stats(pr, stream=f).strip_dirs().sort_stats(sortby).print_stats() 
f.close() 

giá trị hợp lệ của sortby là: cuộc gọi, tích lũy, tập tin, đường dây, module, tên, NFL (tên/file/line), pcalls, stdname, thời gian.

+2

+1 rằng đoạn mã trong tài liệu tại đây http://docs.python.org/2/library/profile.html#profile.Profile khó hiểu liên quan đến dòng ps.print_results() đó. – eedeep

5

Sự cố trong ví dụ trong sách hướng dẫn 2.7 có vẻ là việc sử dụng StringIO. Khi tôi sử dụng một tập tin thực sự như đề xuất của Armin Rigo, thay đổi đó tránh được lỗi. Tư vấn doc lại StringIO Tôi lưu ý

Đối tượng StringIO có thể chấp nhận chuỗi Unicode hoặc 8 bit, nhưng trộn hai có thể mất> một số cẩn thận. Nếu cả hai được sử dụng, các chuỗi 8 bit không thể được hiểu là ASCII 7 bit (mà>> sử dụng bit thứ 8) sẽ gây ra một UnicodeError được nêu lên khi getvalue() được gọi.

getValue() không được gọi ở đây, tuyên bố rằng thất bại là ở pstats.py, có lẽ là nỗ lực in đầu tiên trong print_stats() thực hiện với nhiều hơn để làm theo:

print >> self.stream, indent, self.total_calls, "function calls", 

tôi không thấy đối số in nào gây ra vấn đề và tôi không thấy cách để StringIO chấp nhận bất kỳ print_stats nào đang cố gắng cung cấp cho nó - KHÔNG BAO GIỜ nếu bạn chỉ bỏ qua luồng hoàn toàn, đầu ra sẽ xuất hiện trên stdout :

pr.enable() 
(do the thing) 
pr.disable() 
pstats.Stats(pr).print_stats() 

Nếu stdout là đủ tốt, đó là nó.

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