Làm thế nào bạn có thể lập hồ sơ một tập lệnh Python?

1350
Chris Lawlor 2009-02-25 06:01.

Project Euler và các cuộc thi viết mã khác thường có thời gian tối đa để chạy hoặc mọi người tự hào về giải pháp cụ thể của họ chạy nhanh như thế nào. Với Python, đôi khi các cách tiếp cận hơi kỳ cục - tức là thêm mã định thời vào __main__.

Cách tốt để xác định thời gian chạy một chương trình Python là gì?

29 answers

1438
Chris Lawlor 2009-02-25 06:01.

Python bao gồm một hồ sơ được gọi là cProfile . Nó không chỉ cung cấp tổng thời gian chạy mà còn thời gian cho từng chức năng riêng biệt và cho bạn biết số lần mỗi chức năng được gọi, giúp bạn dễ dàng xác định nơi bạn nên thực hiện tối ưu hóa.

Bạn có thể gọi nó từ trong mã của mình hoặc từ trình thông dịch, như sau:

import cProfile
cProfile.run('foo()')

Hữu ích hơn nữa, bạn có thể gọi cProfile khi chạy một tập lệnh:

python -m cProfile myscript.py

Để làm cho nó dễ dàng hơn, tôi đã tạo một tệp hàng loạt nhỏ có tên là 'profile.bat':

python -m cProfile %1

Vì vậy, tất cả những gì tôi phải làm là chạy:

profile euler048.py

Và tôi nhận được điều này:

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}

CHỈNH SỬA: Liên kết cập nhật đến một nguồn video tốt từ PyCon 2013 có tiêu đề Hồ sơ Python
cũng thông qua YouTube .

440
gak 2012-08-06 19:37.

Một lúc trước, tôi đã pycallgraphtạo ra một hình ảnh trực quan từ mã Python của bạn. Chỉnh sửa: Tôi đã cập nhật ví dụ để hoạt động với 3.3, phiên bản mới nhất kể từ khi viết bài này.

Sau khi pip install pycallgraphcài đặt và cài đặt GraphViz, bạn có thể chạy nó từ dòng lệnh:

pycallgraph graphviz -- ./mypythonscript.py

Hoặc, bạn có thể lập hồ sơ các phần cụ thể của mã của mình:

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

with PyCallGraph(output=GraphvizOutput()):
    code_to_profile()

Một trong hai cách này sẽ tạo ra một pycallgraph.pngtệp tương tự như hình ảnh bên dưới:

208
Joe Shaw 2009-12-18 06:30.

Cần chỉ ra rằng việc sử dụng trình biên dịch chỉ hoạt động (theo mặc định) trên chuỗi chính và bạn sẽ không nhận được bất kỳ thông tin nào từ các chuỗi khác nếu bạn sử dụng chúng. Điều này có thể là một chút gotcha vì nó hoàn toàn không được đề cập trong tài liệu của trình biên dịch .

Nếu bạn cũng muốn lập hồ sơ các chuỗi, bạn sẽ muốn xem threading.setprofile()chức năng trong tài liệu.

Bạn cũng có thể tạo threading.Threadlớp con của riêng mình để làm điều đó:

class ProfiledThread(threading.Thread):
    # Overrides threading.Thread.run()
    def run(self):
        profiler = cProfile.Profile()
        try:
            return profiler.runcall(threading.Thread.run, self)
        finally:
            profiler.dump_stats('myprofile-%d.profile' % (self.ident,))

và sử dụng ProfiledThreadlớp đó thay vì lớp tiêu chuẩn. Nó có thể mang lại cho bạn sự linh hoạt hơn, nhưng tôi không chắc nó đáng giá, đặc biệt nếu bạn đang sử dụng mã của bên thứ ba sẽ không sử dụng lớp của bạn.

158
brent.payne 2011-10-08 14:04.

Python wiki là một trang tuyệt vời để lập hồ sơ tài nguyên: http://wiki.python.org/moin/PythonSpeed/PerformanceTips#Profiling_Code

cũng như tài liệu python: http://docs.python.org/library/profile.html

như được thể hiện bởi Chris Lawlor cProfile là một công cụ tuyệt vời và có thể dễ dàng được sử dụng để in ra màn hình:

python -m cProfile -s time mine.py <args>

hoặc để nộp:

python -m cProfile -o output.file mine.py <args>

PS> Nếu bạn đang sử dụng Ubuntu, hãy đảm bảo cài đặt python-profile

apt-get install python-profiler 

Nếu bạn xuất ra tệp, bạn có thể có được những hình ảnh trực quan đẹp mắt bằng cách sử dụng các công cụ sau

PyCallGraph: một công cụ tạo hình ảnh đồ thị cuộc gọi
cài đặt:

 pip install pycallgraph

chạy:

 pycallgraph mine.py args

lượt xem:

 gimp pycallgraph.png

Bạn có thể sử dụng bất cứ thứ gì bạn muốn để xem tệp png, tôi đã sử dụng gimp
Rất tiếc là tôi thường nhận được

dot: biểu đồ quá lớn đối với các bitmap của trình kết xuất đồ họa. Chia tỷ lệ 0,257079 để phù hợp

điều này làm cho hình ảnh của tôi nhỏ không thể sử dụng được. Vì vậy, tôi thường tạo các tệp svg:

pycallgraph -f svg -o pycallgraph.svg mine.py <args>

PS> đảm bảo cài đặt graphviz (cung cấp chương trình chấm):

pip install graphviz

Vẽ đồ thị thay thế bằng gprof2dot qua @maxy / @quodlibetor:

pip install gprof2dot
python -m cProfile -o profile.pstats mine.py
gprof2dot -f pstats profile.pstats | dot -Tsvg -o mine.svg
139
quodlibetor 2012-12-12 13:16.

Nhận xét của @ Maxy về câu trả lời này đã giúp tôi đủ để tôi nghĩ rằng nó xứng đáng với câu trả lời của riêng nó: Tôi đã có các tệp .pstats do cProfile tạo và tôi không muốn chạy lại mọi thứ với pycallgraph, vì vậy tôi đã sử dụng gprof2dot và khá svgs:

$ sudo apt-get install graphviz $ git clone https://github.com/jrfonseca/gprof2dot
$ ln -s "$PWD"/gprof2dot/gprof2dot.py ~/bin
$ cd $PROJECT_DIR
$ gprof2dot.py -f pstats profile.pstats | dot -Tsvg -o callgraph.svg

và BLAM!

Nó sử dụng dấu chấm (cùng một thứ mà pycallgraph sử dụng) để đầu ra trông giống nhau. Tôi có ấn tượng rằng gprof2dot mất ít thông tin hơn:

89
zaxliu 2016-05-25 22:06.

Tôi tình cờ gặp một công cụ tiện dụng có tên là SnakeViz khi nghiên cứu chủ đề này. SnakeViz là một công cụ trực quan hóa hồ sơ dựa trên web. Nó rất dễ cài đặt và sử dụng. Cách thông thường mà tôi sử dụng là tạo một tệp thống kê %prunvà sau đó thực hiện phân tích trong SnakeViz.

Kỹ thuật viz chính được sử dụng là biểu đồ Sunburst như được hiển thị bên dưới, trong đó thứ bậc của các lệnh gọi hàm được sắp xếp dưới dạng các lớp cung và thông tin thời gian được mã hóa theo độ rộng góc của chúng.

Điều tốt nhất là bạn có thể tương tác với biểu đồ. Ví dụ, để phóng to, người ta có thể nhấp vào một vòng cung, và vòng cung và con cháu của nó sẽ được phóng to như một tia sáng mặt trời mới để hiển thị nhiều chi tiết hơn.

85
CodeCabbie 2018-03-09 03:03.

Cách đơn giảnnhanh nhất để tìm mọi lúc mọi nơi.

1. pip install snakeviz

2. python -m cProfile -o temp.dat <PROGRAM>.py

3. snakeviz temp.dat

Vẽ biểu đồ hình tròn trong trình duyệt. Phần lớn nhất là chức năng vấn đề. Rất đơn giản.

60
Federico 2016-05-11 22:32.

cProfilerất tốt cho việc lập hồ sơ, trong khi kcachegrindrất tốt cho việc hình dung kết quả. Ở pyprof2calltreegiữa xử lý chuyển đổi tệp.

python -m cProfile -o script.profile script.py
pyprof2calltree -i script.profile -o script.calltree
kcachegrind script.calltree

Để cài đặt các công cụ cần thiết (ít nhất là trên Ubuntu):

apt-get install kcachegrind
pip install pyprof2calltree

Kết quả:

44
Nico Schlömer 2018-08-04 21:27.

Gần đây tôi đã tạo cá ngừ để trực quan hóa thời gian chạy Python và hồ sơ nhập; điều này có thể hữu ích ở đây.

Cài đặt với

pip install tuna

Tạo hồ sơ thời gian chạy

python3 -m cProfile -o program.prof yourfile.py

hoặc một hồ sơ nhập (yêu cầu Python 3.7+)

python3 -X importprofile yourfile.py 2> import.log

Sau đó, chỉ cần chạy cá ngừ trên tệp

tuna program.prof
41
Pete 2015-02-23 06:18.

Cũng đáng nói là trình xem kết xuất GUI cProfile RunSnakeRun . Nó cho phép bạn sắp xếp và lựa chọn, từ đó phóng to các phần có liên quan của chương trình. Kích thước của các hình chữ nhật trong hình tỷ lệ thuận với thời gian thực hiện. Nếu bạn di chuột qua một hình chữ nhật, nó sẽ đánh dấu lệnh gọi đó trong bảng và mọi nơi trên bản đồ. Khi bạn nhấp đúp vào một hình chữ nhật, nó sẽ phóng to phần đó. Nó sẽ cho bạn biết ai gọi phần đó và phần đó gọi gì.

Thông tin mô tả rất hữu ích. Nó hiển thị cho bạn mã cho bit đó có thể hữu ích khi bạn xử lý các lệnh gọi thư viện tích hợp sẵn. Nó cho bạn biết tệp nào và dòng nào để tìm mã.

Cũng muốn chỉ ra rằng OP đã nói "hồ sơ" nhưng có vẻ như ông ấy muốn nói đến "thời gian". Hãy nhớ rằng các chương trình sẽ chạy chậm hơn khi được cấu hình.

35
BenC 2015-03-03 01:36.

pprofile

line_profiler(đã được trình bày ở đây) cũng được truyền cảm hứng pprofile, được mô tả là:

Mức độ chi tiết của dòng, xác định chủ đề nhận biết chuỗi và thông tin thống kê thuần túy python

Nó cung cấp độ chi tiết của dòng line_profiler, là Python thuần túy, có thể được sử dụng như một lệnh độc lập hoặc một mô-đun và thậm chí có thể tạo các tệp định dạng callgrind có thể dễ dàng phân tích [k|q]cachegrind.

vprof

Ngoài ra còn có vprof , một gói Python được mô tả là:

[...] cung cấp hình ảnh trực quan phong phú và tương tác cho các đặc điểm chương trình Python khác nhau như thời gian chạy và sử dụng bộ nhớ.

33
Ian Langmore 2011-10-21 06:05.

Một mô-đun cấu hình tốt là line_profiler (được gọi bằng cách sử dụng script kernprof.py). Nó có thể được tải xuống tại đây .

Sự hiểu biết của tôi là cProfile chỉ cung cấp thông tin về tổng thời gian dành cho mỗi chức năng. Vì vậy, các dòng mã riêng lẻ không được tính thời gian. Đây là một vấn đề trong tính toán khoa học vì thường một dòng đơn lẻ có thể mất rất nhiều thời gian. Ngoài ra, như tôi nhớ, cProfile không nắm bắt được thời gian mà tôi đã bỏ ra để nói numpy.dot.

16
David Mašek 2015-08-22 01:59.

Có rất nhiều câu trả lời tuyệt vời nhưng chúng sử dụng dòng lệnh hoặc một số chương trình bên ngoài để lập hồ sơ và / hoặc sắp xếp kết quả.

Tôi thực sự đã bỏ lỡ một số cách tôi có thể sử dụng trong IDE của mình (eclipse-PyDev) mà không cần chạm vào dòng lệnh hoặc cài đặt bất kỳ thứ gì. Vì vậy, nó đây.

Lập hồ sơ không có dòng lệnh

def count():
    from math import sqrt
    for x in range(10**5):
        sqrt(x)

if __name__ == '__main__':
    import cProfile, pstats
    cProfile.run("count()", "{}.profile".format(__file__))
    s = pstats.Stats("{}.profile".format(__file__))
    s.strip_dirs()
    s.sort_stats("time").print_stats(10)

Xem tài liệu hoặc các câu trả lời khác để biết thêm thông tin.

12
PypeBros 2011-11-10 02:59.

Sau câu trả lời của Joe Shaw về việc mã đa luồng không hoạt động như mong đợi, tôi đã phát hiện ra rằng runcallphương thức trong cProfile chỉ đơn thuần là thực hiện self.enable()self.disable()gọi xung quanh lệnh gọi hàm hồ sơ, vì vậy bạn có thể đơn giản tự làm điều đó và có bất kỳ mã nào bạn muốn ở giữa can thiệp tối thiểu với mã hiện có.

10
Walter 2009-02-25 10:31.

Trong nguồn của Virtaal, có một lớp và trình trang trí rất hữu ích có thể làm cho việc lập hồ sơ (ngay cả đối với các phương thức / chức năng cụ thể) rất dễ dàng. Đầu ra sau đó có thể được xem rất thoải mái trong KCacheGrind.

9
Datageek 2015-03-31 01:11.

cProfile rất tuyệt vời để lập hồ sơ nhanh chóng nhưng hầu hết thời gian nó đều kết thúc với tôi với các lỗi. Hàm runctx giải quyết vấn đề này bằng cách khởi tạo chính xác môi trường và các biến, hy vọng nó có thể hữu ích cho ai đó:

import cProfile
cProfile.runctx('foo()', None, locals())
9
Francois 2019-08-08 09:37.

Giải pháp chỉ dành cho thiết bị đầu cuối (và đơn giản nhất), trong trường hợp tất cả các giao diện người dùng ưa thích đó không thể cài đặt hoặc chạy:
bỏ qua cProfilehoàn toàn và thay thế nó bằng pyinstrument, sẽ thu thập và hiển thị cây lệnh gọi ngay sau khi thực thi.

Tải về:

$ pip install pyinstrument

Hồ sơ và kết quả hiển thị:

$ python -m pyinstrument ./prog.py

Hoạt động với python2 và 3.

[EDIT] Bạn có thể tìm thấy tài liệu của API, chỉ để mô tả một phần của mã tại đây .

8
moshevi 2019-09-12 09:52.

Nếu bạn muốn tạo một hồ sơ tích lũy, nghĩa là chạy hàm nhiều lần liên tiếp và xem tổng kết quả.

bạn có thể sử dụng trình cumulative_profilertrang trí này :

đó là python> = 3.6 cụ thể, nhưng bạn có thể xóa nonlocalđể nó hoạt động trên các phiên bản cũ hơn.

import cProfile, pstats

class _ProfileFunc:
    def __init__(self, func, sort_stats_by):
        self.func =  func
        self.profile_runs = []
        self.sort_stats_by = sort_stats_by

    def __call__(self, *args, **kwargs):
        pr = cProfile.Profile()
        pr.enable()  # this is the profiling section
        retval = self.func(*args, **kwargs)
        pr.disable()

        self.profile_runs.append(pr)
        ps = pstats.Stats(*self.profile_runs).sort_stats(self.sort_stats_by)
        return retval, ps

def cumulative_profiler(amount_of_times, sort_stats_by='time'):
    def real_decorator(function):
        def wrapper(*args, **kwargs):
            nonlocal function, amount_of_times, sort_stats_by  # for python 2.x remove this row

            profiled_func = _ProfileFunc(function, sort_stats_by)
            for i in range(amount_of_times):
                retval, ps = profiled_func(*args, **kwargs)
            ps.print_stats()
            return retval  # returns the results of the function
        return wrapper

    if callable(amount_of_times):  # incase you don't want to specify the amount of times
        func = amount_of_times  # amount_of_times is the function in here
        amount_of_times = 5  # the default amount
        return real_decorator(func)
    return real_decorator

Thí dụ

lập hồ sơ chức năng baz

import time

@cumulative_profiler
def baz():
    time.sleep(1)
    time.sleep(2)
    return 1

baz()

baz chạy 5 lần và in cái này:

         20 function calls in 15.003 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       10   15.003    1.500   15.003    1.500 {built-in method time.sleep}
        5    0.000    0.000   15.003    3.001 <ipython-input-9-c89afe010372>:3(baz)
        5    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

xác định số lần

@cumulative_profiler(3)
def baz():
    ...
6
Mr. Girgitt 2014-02-20 05:38.

Cách của tôi là sử dụng yappi (https://github.com/sumerc/yappi). Nó đặc biệt hữu ích khi kết hợp với máy chủ RPC nơi (thậm chí chỉ để gỡ lỗi) bạn đăng ký phương thức để bắt đầu, dừng và in thông tin hồ sơ, ví dụ theo cách này:

@staticmethod
def startProfiler():
    yappi.start()

@staticmethod
def stopProfiler():
    yappi.stop()

@staticmethod
def printProfiler():
    stats = yappi.get_stats(yappi.SORTTYPE_TTOT, yappi.SORTORDER_DESC, 20)
    statPrint = '\n'
    namesArr = [len(str(stat[0])) for stat in stats.func_stats]
    log.debug("namesArr %s", str(namesArr))
    maxNameLen = max(namesArr)
    log.debug("maxNameLen: %s", maxNameLen)

    for stat in stats.func_stats:
        nameAppendSpaces = [' ' for i in range(maxNameLen - len(stat[0]))]
        log.debug('nameAppendSpaces: %s', nameAppendSpaces)
        blankSpace = ''
        for space in nameAppendSpaces:
            blankSpace += space

        log.debug("adding spaces: %s", len(nameAppendSpaces))
        statPrint = statPrint + str(stat[0]) + blankSpace + " " + str(stat[1]).ljust(8) + "\t" + str(
            round(stat[2], 2)).ljust(8 - len(str(stat[2]))) + "\t" + str(round(stat[3], 2)) + "\n"

    log.log(1000, "\nname" + ''.ljust(maxNameLen - 4) + " ncall \tttot \ttsub")
    log.log(1000, statPrint)

Sau đó, khi chương trình của bạn hoạt động, bạn có thể khởi động trình biên dịch bất kỳ lúc nào bằng cách gọi startProfilerphương thức RPC và kết xuất thông tin hồ sơ vào tệp nhật ký bằng cách gọi printProfiler(hoặc sửa đổi phương thức rpc để trả lại nó cho người gọi) và nhận được đầu ra như vậy:

2014-02-19 16:32:24,128-|SVR-MAIN  |-(Thread-3   )-Level 1000: 
name                                                                                                                                      ncall     ttot    tsub
2014-02-19 16:32:24,128-|SVR-MAIN  |-(Thread-3   )-Level 1000: 
C:\Python27\lib\sched.py.run:80                                                                                                           22        0.11    0.05
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\xmlRpc.py.iterFnc:293                                                22        0.11    0.0
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\serverMain.py.makeIteration:515                                                    22        0.11    0.0
M:\02_documents\_repos\09_aheadRepos\apps\ahdModbusSrv\pyAheadRpcSrv\PicklingXMLRPC.py._dispatch:66                                       1         0.0     0.0
C:\Python27\lib\BaseHTTPServer.py.date_time_string:464                                                                                    1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py._get_raw_meminfo:243     4         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.decode_request_content:537                                                                          1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\_psmswindows.py.get_system_cpu_times:148 4         0.0     0.0
<string>.__new__:8                                                                                                                        220       0.0     0.0
C:\Python27\lib\socket.py.close:276                                                                                                       4         0.0     0.0
C:\Python27\lib\threading.py.__init__:558                                                                                                 1         0.0     0.0
<string>.__new__:8                                                                                                                        4         0.0     0.0
C:\Python27\lib\threading.py.notify:372                                                                                                   1         0.0     0.0
C:\Python27\lib\rfc822.py.getheader:285                                                                                                   4         0.0     0.0
C:\Python27\lib\BaseHTTPServer.py.handle_one_request:301                                                                                  1         0.0     0.0
C:\Python27\lib\xmlrpclib.py.end:816                                                                                                      3         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.do_POST:467                                                                                         1         0.0     0.0
C:\Python27\lib\SimpleXMLRPCServer.py.is_rpc_path_valid:460                                                                               1         0.0     0.0
C:\Python27\lib\SocketServer.py.close_request:475                                                                                         1         0.0     0.0
c:\users\zasiec~1\appdata\local\temp\easy_install-hwcsr1\psutil-1.1.2-py2.7-win32.egg.tmp\psutil\__init__.py.cpu_times:1066               4         0.0     0.0 

Nó có thể không hữu ích lắm đối với các tập lệnh ngắn nhưng giúp tối ưu hóa các quy trình kiểu máy chủ, đặc biệt là printProfilerphương pháp này có thể được gọi nhiều lần theo thời gian để lập hồ sơ và so sánh, ví dụ như các kịch bản sử dụng chương trình khác nhau.

Trong các phiên bản yappi mới hơn, mã sau sẽ hoạt động:

@staticmethod
def printProfile():
    yappi.get_func_stats().print_all()
5
Aditya Patnaik 2020-05-26 05:07.

Để nhận số liệu thống kê hồ sơ nhanh chóng trên máy tính xách tay IPython. Người ta có thể nhúng line_profilermemory_profiler thẳng vào sổ ghi chép của họ.

Một gói hữu ích khác là Pympler . Đây là một gói cấu hình mạnh mẽ có khả năng theo dõi các lớp, đối tượng, chức năng, rò rỉ bộ nhớ, v.v. Ví dụ bên dưới, Tài liệu đính kèm.

Hiểu rồi!

!pip install line_profiler
!pip install memory_profiler
!pip install pympler

Tải nó!

%load_ext line_profiler
%load_ext memory_profiler

Sử dụng nó!


%thời gian

%time print('Outputs CPU time,Wall Clock time') 
#CPU times: user 2 µs, sys: 0 ns, total: 2 µs Wall time: 5.96 µs

Cung cấp:

  • CPU times: thời gian thực thi mức CPU
  • sys times: thời gian thực hiện cấp hệ thống
  • tổng: thời gian CPU + thời gian hệ thống
  • Thời gian treo tường: Giờ đồng hồ treo tường

% thời gian

%timeit -r 7 -n 1000 print('Outputs execution time of the snippet') 
#1000 loops, best of 7: 7.46 ns per loop
  • Cung cấp thời gian tốt nhất trong số các lần chạy (r) nhất định trong (n) lần lặp lại.
  • Kết quả chi tiết về bộ nhớ đệm hệ thống:
    • Khi các đoạn mã được thực thi nhiều lần, hệ thống sẽ lưu vào bộ nhớ cache một số tùy chọn và không thực thi lại chúng, điều này có thể cản trở tính chính xác của báo cáo tiểu sử.

% prun

%prun -s cumulative 'Code to profile' 

Cung cấp:

  • số lượng lệnh gọi hàm (ncalls)
  • có các mục nhập cho mỗi lệnh gọi hàm (riêng biệt)
  • thời gian thực hiện mỗi cuộc gọi (percall)
  • thời gian trôi qua cho đến khi gọi hàm đó (cumtime)
  • tên của func / mô-đun được gọi là vv ...


% memit

%memit 'Code to profile'
#peak memory: 199.45 MiB, increment: 0.00 MiB

Cung cấp:

  • Sử dụng bộ nhớ

% lprun

#Example function
def fun():
  for i in range(10):
    print(i)

#Usage: %lprun <name_of_the_function> function
%lprun -f fun fun()

Cung cấp:

  • Số liệu thống kê về dòng


sys.getsizeof

sys.getsizeof('code to profile')
# 64 bytes

Trả về kích thước của một đối tượng tính bằng byte.


asizeof () từ pympler

from pympler import asizeof
obj = [1,2,("hey","ha"),3]
print(asizeof.asizeof(obj,stats=4))

pympler.asizeof có thể được sử dụng để điều tra xem các đối tượng Python nhất định sử dụng bao nhiêu bộ nhớ. Ngược lại với sys.getsizeof, các đối tượng kích thước asizeof một cách đệ quy


trình theo dõi từ pympler

from pympler import tracker
tr = tracker.SummaryTracker()
def fun():
  li = [1,2,3]
  di = {"ha":"haha","duh":"Umm"}
fun()
tr.print_diff()

Theo dõi thời gian tồn tại của một hàm.

Gói Pympler bao gồm một số lượng lớn các chức năng tiện ích cao cho mã hồ sơ. Tất cả những điều đó không thể được đề cập ở đây. Xem tài liệu đính kèm để biết cách triển khai hồ sơ chi tiết.

Tài liệu Pympler

4
Fabio Zadrozny 2015-04-29 12:50.

Một công cụ mới để xử lý việc lập hồ sơ bằng Python là PyVmMonitor: http://www.pyvmmonitor.com/

Nó có một số tính năng độc đáo như

  • Đính kèm hồ sơ vào chương trình đang chạy (CPython)
  • Hồ sơ theo yêu cầu với tích hợp Yappi
  • Hồ sơ trên một máy khác
  • Hỗ trợ nhiều quy trình (đa xử lý, django ...)
  • Lấy mẫu trực tiếp / chế độ xem CPU (với lựa chọn phạm vi thời gian)
  • Cấu hình xác định thông qua tích hợp cProfile / profile
  • Phân tích kết quả PStats hiện có
  • Mở tệp DOT
  • Quyền truy cập API theo chương trình
  • Nhóm mẫu theo phương pháp hoặc dòng
  • Tích hợp PyDev
  • Tích hợp PyCharm

Lưu ý: nó là thương mại, nhưng miễn phí cho mã nguồn mở.

4
Mattijn 2019-07-20 03:59.

gprof2dot_magic

Hàm ma thuật gprof2dotđể cấu hình bất kỳ câu lệnh Python nào dưới dạng đồ thị DOT trong JupyterLab hoặc Máy tính xách tay Jupyter.

GitHub repo: https://github.com/mattijn/gprof2dot_magic

cài đặt

Đảm bảo rằng bạn đã có gói Python gprof2dot_magic.

pip install gprof2dot_magic

Các phụ thuộc của nó gprof2dotgraphvizcũng sẽ được cài đặt

sử dụng

Để kích hoạt chức năng ma thuật, trước tiên hãy tải gprof2dot_magicmô-đun

%load_ext gprof2dot_magic

và sau đó cấu hình bất kỳ câu lệnh dòng nào dưới dạng đồ thị DOT như sau:

%gprof2dot print('hello world')

3
Colonel Panic 2012-10-14 05:21.

Bạn có bao giờ muốn biết tập lệnh python đó đang làm cái quái gì không? Nhập Shell Kiểm tra. Kiểm tra Shell cho phép bạn in / thay đổi hình cầu và chạy các chức năng mà không làm gián đoạn tập lệnh đang chạy. Bây giờ với tính năng tự động hoàn thành và lịch sử lệnh (chỉ trên linux).

Kiểm tra Shell không phải là một trình gỡ lỗi kiểu pdb.

https://github.com/amoffat/Inspect-Shell

Bạn có thể sử dụng nó (và đồng hồ đeo tay của bạn).

3
michael 2015-03-22 03:50.

Để thêm vào https://stackoverflow.com/a/582337/1070617,

Tôi đã viết mô-đun này cho phép bạn sử dụng cProfile và xem đầu ra của nó một cách dễ dàng. Thêm ở đây:https://github.com/ymichael/cprofilev

$ python -m cprofilev /your/python/program
# Go to http://localhost:4000 to view collected statistics.

Cũng thấy: http://ymichael.com/2014/03/08/profiling-python-with-cprofile.html về cách hiểu các số liệu thống kê được thu thập.

3
VishalMishra 2017-04-20 09:42.

Nó sẽ phụ thuộc vào những gì bạn muốn xem trong hồ sơ. Các chỉ số thời gian đơn giản có thể được đưa ra bởi (bash).

time python python_prog.py

Ngay cả '/ usr / bin / time' cũng có thể xuất ra các chỉ số chi tiết bằng cách sử dụng cờ '--verbose'.

Để kiểm tra số liệu thời gian được cung cấp bởi từng chức năng và để hiểu rõ hơn về lượng thời gian dành cho các chức năng, bạn có thể sử dụng cProfile có sẵn trong python.

Đi vào các số liệu chi tiết hơn như hiệu suất, thời gian không phải là số liệu duy nhất. Bạn có thể lo lắng về bộ nhớ, luồng, v.v.
Tùy chọn cấu hình:
1. line_profiler là một trình biên dịch khác được sử dụng phổ biến để tìm ra các số liệu thời gian từng dòng một.
2. memory_profiler là một công cụ để lập hồ sơ sử dụng bộ nhớ.
3. heapy (từ dự án Guppy) Sơ lược về cách các đối tượng trong heap được sử dụng.

Đây là một số trong những cái phổ biến mà tôi có xu hướng sử dụng. Nhưng nếu bạn muốn tìm hiểu thêm, hãy thử đọc cuốn sách này Đây là một cuốn sách khá hay về việc bắt đầu với hiệu suất trong tâm trí. Bạn có thể chuyển sang các chủ đề nâng cao bằng cách sử dụng python được biên dịch Cython và JIT (Just-in-time).

2
Phoenix87 2020-03-14 00:10.

Với một trình biên dịch thống kê như austin , không cần thiết bị đo đạc, có nghĩa là bạn có thể lấy dữ liệu hồ sơ từ một ứng dụng Python đơn giản với

austin python3 my_script.py

Đầu ra thô không hữu ích lắm, nhưng bạn có thể chuyển nó đến flamegraph.pl để có được biểu đồ ngọn lửa của dữ liệu đó, cung cấp cho bạn bảng phân tích thời gian (được đo bằng micro giây của thời gian thực) đang được sử dụng.

austin python3 my_script.py | flamegraph.pl > my_script_profile.svg
1
z0r 2016-02-12 12:50.

Ngoài ra còn có một hồ sơ thống kê được gọi là statprof. Đó là một trình biên dịch lấy mẫu, vì vậy nó thêm chi phí tối thiểu vào mã của bạn và cung cấp thời gian dựa trên dòng (không chỉ dựa trên chức năng). Nó phù hợp hơn với các ứng dụng thời gian thực mềm như trò chơi, nhưng có thể có độ chính xác kém hơn cProfile.

Các phiên bản trong pypi là một chút cũ, vì vậy có thể cài đặt nó với pipbằng cách xác định các kho git :

pip install git+git://github.com/bos/[email protected]

Bạn có thể chạy nó như thế này:

import statprof

with statprof.profile():
    my_questionable_function()

Xem thêm https://stackoverflow.com/a/10333592/320036

1
Ali 2020-02-13 02:03.

Tôi vừa phát triển hồ sơ của riêng mình lấy cảm hứng từ pypref_time:

https://github.com/modaresimr/auto_profiler

Bằng cách thêm một trình trang trí, nó sẽ hiển thị một cây các chức năng tiêu tốn thời gian

@Profiler(depth=4, on_disable=show)

Install by: pip install auto_profiler

Thí dụ

import time # line number 1
import random

from auto_profiler import Profiler, Tree

def f1():
    mysleep(.6+random.random())

def mysleep(t):
    time.sleep(t)

def fact(i):
    f1()
    if(i==1):
        return 1
    return i*fact(i-1)


def show(p):
    print('Time   [Hits * PerHit] Function name [Called from] [Function Location]\n'+\
          '-----------------------------------------------------------------------')
    print(Tree(p.root, threshold=0.5))
    
@Profiler(depth=4, on_disable=show)
def main():
    for i in range(5):
        f1()

    fact(3)


if __name__ == '__main__':
    main()

Đầu ra mẫu


Time   [Hits * PerHit] Function name [Called from] [function location]
-----------------------------------------------------------------------
8.974s [1 * 8.974]  main  [auto-profiler/profiler.py:267]  [/test/t2.py:30]
├── 5.954s [5 * 1.191]  f1  [/test/t2.py:34]  [/test/t2.py:14]
│   └── 5.954s [5 * 1.191]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
│       └── 5.954s [5 * 1.191]  <time.sleep>
|
|
|   # The rest is for the example recursive function call fact
└── 3.020s [1 * 3.020]  fact  [/test/t2.py:36]  [/test/t2.py:20]
    ├── 0.849s [1 * 0.849]  f1  [/test/t2.py:21]  [/test/t2.py:14]
    │   └── 0.849s [1 * 0.849]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
    │       └── 0.849s [1 * 0.849]  <time.sleep>
    └── 2.171s [1 * 2.171]  fact  [/test/t2.py:24]  [/test/t2.py:20]
        ├── 1.552s [1 * 1.552]  f1  [/test/t2.py:21]  [/test/t2.py:14]
        │   └── 1.552s [1 * 1.552]  mysleep  [/test/t2.py:15]  [/test/t2.py:17]
        └── 0.619s [1 * 0.619]  fact  [/test/t2.py:24]  [/test/t2.py:20]
            └── 0.619s [1 * 0.619]  f1  [/test/t2.py:21]  [/test/t2.py:14]
0
Vincent Fenet 2017-02-03 00:18.

Khi tôi không root trên máy chủ, tôi sử dụng lsprofcalltree.py và chạy chương trình của mình như sau:

python lsprofcalltree.py -o callgrind.1 test.py

Sau đó, tôi có thể mở báo cáo bằng bất kỳ phần mềm nào tương thích với callgrind, chẳng hạn như qcachegrind

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Trong Saturday Night Live, The Bachelor is Bland và Tina Fey trở lại với vai 'Crazy' Sarah Palin

Trong Saturday Night Live, The Bachelor is Bland và Tina Fey trở lại với vai 'Crazy' Sarah Palin

Sau khi Sarah Palin tán thành Donald Trump vào đầu tuần này, gần như không thể tránh khỏi việc Tina Fey sẽ trở lại Saturday Night Live để thăm lại ấn tượng Palin cổ điển của cô. Và Fey chắc chắn đã không làm thất vọng, cô ấy đã đưa ra một lời khen ngợi không hề nhẹ về bài phát biểu chứng thực Iowa quanh co và khó hiểu của Palin trong khi Trump của Darrell Hammond đưa ra bình luận xuyên suốt.

Đây có phải là sự khởi đầu cho sự kết thúc của việc giam giữ Brittney Griner?

Đây có phải là sự khởi đầu cho sự kết thúc của việc giam giữ Brittney Griner?

Brittney Griner (r.) Ngay từ đầu, thân phận của Brittney Griner đã là tình huống con tin Mỹ độc nhất trong lịch sử hiện đại.

Tom Brady là bộ tứ vệ đầu tiên cuối cùng có thể giúp Julio Jones có hơn 10 lần chạm bóng trong một mùa giải

Tom Brady là bộ tứ vệ đầu tiên cuối cùng có thể giúp Julio Jones có hơn 10 lần chạm bóng trong một mùa giải

Chúng ta có thể thấy nhiều hơn nữa về một Julio Jones khỏe mạnh trong khu vực cuối năm nay. John Parker Wilson, Greg McElroy, A.

Đó phải là Đức

Đó phải là Đức

Đối với đội tuyển Anh, không có kẻ thủ ác nào lớn hơn Hầu hết các cổ động viên Anh, nếu không muốn nói là tất cả, hẳn sẽ phải gật gù khi tiếng còi mãn cuộc của trận bán kết lượt về W Euro 2022 vang lên. Bởi vì nó báo hiệu rằng Đức sẽ chờ đợi ở Wembley trong trận chung kết với Anh và là điều duy nhất giữa Anh và chiếc cúp lớn đầu tiên của đội tuyển nữ.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language