Starts profiling all threads in the current interpreter instance. This function can be called from any thread at any time.
Resumes profiling if stop() is called previously.
builtins
enables profiling of builtin functions.
profile_threads
enables profiling of all threads. If this flag is true, all current threads and the ones that are generated
in the future will be profiled.
profile_greenlets
enables profiling of multiple greenlets. This argument is only respected when context backend is
'greenlet' and ignored otherwise.
Stop the profiler.
Same profiling session might be resumed later by calling start()
.
Clears the profiler results.
All results stay in memory unless application (all threads including the main thread) exits or clear_stats()
is explicitly called.
Returns the function stats as a list of YFuncStat
object. As Yappi is a C extension, it catches the profile data in C API.
Thus, the profile data collected is buffered until clear_stats
is called. get_func_stats
function enumerates the underlying
buffered data and aggregates the information there. The functions that contain same index id will be aggregated in a single YFuncStat
object. So, if you want to select a specific tag
or ctx_id
, you need to select by providing them as arguments to get_func_stats
.
Otherwise, data with different tag
/ctx_id
will be combined into one YFuncStat
object. If you really would like to enumerate
buffered stats in raw, you can use an undocumented function: _yappi.enum_func_stats(enum_callback, filter_dict)
. You can see
the usage in get_func_stats
function.
Note:
Filtering tag
and ctx_id
are very fast compared to using filter_callback
since the filtering is completely done on the C extension
with an internal hash table.
tag
retrieves the YFuncStat
objects having the same tag
as specified.
ctx_id
retrieves the YFuncStat
objects having the same ctx_id
as specified.
filter_callback
is a callback which takes a YFuncStat
object as an argument and returns a boolean value to indicate
to include or exclude it. As the object is directly passed to the filter_callback
you can easily filter on any attribute
that YFuncStat
has.
Note:
The filter
dict is deprecated. Please do not use it anymore. We still support that for backward compatability but
it is not recommended anymore.
An example demonstrating how filter_callback
can be used to filter on a function name having foo
:
stats = yappi.get_func_stats(
filter_callback=lambda x: x.name == 'foo'
).print_all()
There are handy functions that can be used with filter_callback
to match multiple functions or modules easily.
See func_matches and module_matches.
Returns the thread stats as a YThreadStat
object.
Returns the greenlet stats as a YGreenletStats
object.
Returns a boolean indicating whether profiler is running or not.
Returns information about the underlying clock type Yappi should use to measure timing.
Read Clock Types for more information.
Sets the underlying clock type. type
must be one of "wall"
or "cpu"
.
Read Clock Types for more information.
This function returns True
if the stat
(YStat
) object is in a given list of funcs
(callable
) list.
An example usage is when filtering stats based on actual function objects:
def a():
pass
def b():
pass
...
stats = yappi.get_func_stats(
filter_callback=lambda x: yappi.func_matches(x, [a, b])
)
Note:
Once a profile session is saved or loaded from a file, you cannot use
func_matches
on the items as the mapping between the stats and the functions are
not serialized.
This function returns True
if the stat
(YStat
) object is in a given list of modules
(ModuleType
) list.
An example usage is when filtering stats based on actual module objects:
import collections
...
stats = yappi.get_func_stats(
filter_callback=lambda x: yappi.module_matches(x, [collections])
)
Note:
Once a profile session is saved or loaded from a file, you cannot use
func_matches
on the items as the mapping between the stats and the functions are
not serialized.
Sets the internal context backend used to track execution context. Type must be one of 'greenlet' or 'native_thread'.
Default is native_thread
and there is no need to call this function for initialization.
Setting the context backend will reset any callbacks configured via:
- `set_context_id_callback`
- `set_context_name_callback`
callback
is a simple callable with no arguments that returns an integer.
callback
is called for every profile event to get the current context id of a running context.
In Yappi terminology a context
means a construct that has its own callstack. It defaults to uniquely identifying a threading.Thread object, but there might be some advanced cases for this one, like a different threading library is used.
This is an internally used function, so please do not play with unless you have a good reason.
Note:
The context id callback can be called from the threading.Thread
initialization code and thus can hold some related
locks in threading
library(e.x: _active_limbo_lock). So, it is not safe to use threading APIs like threading.current_thread()
which can also use these locks and lead to deadlocks. However, it is safe to use threading.local()
or global variables
using your own locks.
callback
is a simple callable with no arguments that returns an integer.
callback
is called for every profile event to get the current tag id of a running function.
In Yappi, every profiled function is associated with a tag. By default, this tag is same for all stats collected. You can change this behavior and aggregate different function stat data in different tags. This will give additional name-spacing on what kind of data to collect.
A recent use case for this functionality is aggregating of single request/response cycle in an ASGI application via contextvar
module. See here for details. It can also be used for profiling multithreaded WSGI applications, too.
A simple example demonstrating on how it can be used to profile request/response cycles in a multithreaded WSGI application where every request/response is handled by a different thread. See here for more details.
_req_counter = 0
tlocal = threading.local()
def _worker_tag_cbk():
global _req_counter
if not hasattr(tlocal, '_request_id'):
_req_counter += 1 # protect this with mutex
tlocal._request_id = _req_counter
return tlocal._request_id
yappi.set_tag_callback(_worker_tag_cbk)
yappi.start()
...
# code that starts a server serving request with different threads
...
yappi.stop()
# get per-request/response cycle profiling info
for i in range(_req_counter):
req_stats = yappi.get_func_stats(filter={'tag': i})
req_stats.print_all()
Note:
Relevant request id is held in a thread local storage and we simply increment the counter when we encounter a new thread. Above code will aggregate all stats into a single tag for every function called from the same thread.
Returns the internal memory usage of the profiler itself.
Converts the internal stat type of Yappi (as returned by YFuncStat.get()
) to a pstats
object.
This holds the stat items as a list of YFuncStat
objects.
Attribute | Description |
---|---|
name | name of the executed function |
module | module name of the executed function |
lineno | line number of the executed function |
ncall | number of times the executed function is called. |
nactualcall | number of times the executed function is called, excluding the recursive calls. |
builtin | bool, indicating whether the executed function is a builtin |
ttot | total time spent in the executed function |
tsub | total time spent in the executed function, excluding subcalls |
tavg | per-call average total time spent in the executed function. |
index | unique id for the YFuncStat object |
children | list of YChildFuncStat objects |
ctx_id | id of the underlying context(thread) |
ctx_name | name of the underlying context(thread) |
full_name | unique full name of the executed function |
tag | tag of the executed function. (set via set_tag_callback ) |
This method retrieves the current profiling stats.
yappi.get_func_stats()
is actually just a wrapper for this function.
This method loads the saved profile stats stored in file at path
.
type
indicates the type of the saved profile stats.
Currently, only loading from "ystat"
format is possible. "ystat"
is the current Yappi internal format.`
This method saves the current profile stats to file at path
.
type
indicates the target type that the profile stats will be saved in.
Can be either
"pstat"
or
"callgrind"
.
This method prints the current profile stats to out
.
This method sorts the current profile stats.
The sort_type
must be one of the following:
ncall
ttot
tsub
tavg
sort_order
must be either "desc"
or "asc"
Clears the stats.
Note:
This method only clears the current object. You need to explicitly call yappi.clear_stats()
to clear the current profile session stats.
Returns a boolean indicating whether we have any stats available or not.
Strip the directory information from the results. Affects the child function stats too.
This method debug prints the current profile stats to stdout.
Debug print prints out callee functions and more detailed info than the print_all()
function call.
YThreadStat
object has following attributes:
Attribute | Description |
---|---|
name | class name of the current thread object which is derived from the threading.Thread class |
id | a unique id given by Yappi (ctx_id) |
tid | the real OS thread id |
ttot | total time spent in the thread |
sched_count | number of times this thread is scheduled. |
YGreenletStats
object has following attributes:
Attribute | Description |
---|---|
name | class name of the current greenlet |
id | a unique id given by Yappi (ctx_id) |
ttot | total time spent in the thread |
sched_count | number of times this thread is scheduled. |
This method retrieves the current thread stats.
yappi.get_thread_stats()
is actually just a wrapper for this function.
This method prints the current profile stats to the file out
.
This method sorts the current profile stats.
sort_type
must be either "ttot"
or "scnt"
sort_order
must be either "desc"
or "asc"
Clears the retrieved stats.
Note:
This method only clears the current object. You need to explicitly call yappi.clear_stats()
to clear the current profile session stats.
Returns a bool
indicating whether we have any stats available or not.
This holds a list of child functions called from the main executed function as a YChildFuncStat
object.
This class holds a list of YChildFuncStat
objects.
For example, if a
calls b
, then a.children
will hold b
as a YChildFuncStat
object.
YChildFuncStat
object has following attributes:
Attribute | Description |
---|---|
name | name of the executed function |
module | module name of the executed function |
lineno | line number of the executed function |
ncall | number of times the executed function is called. |
nactualcall | number of times the executed function is called, excluding the recursive calls. |
builtin | bool, indicating whether the executed function is a builtin |
ttot | total time spent in the executed function |
tsub | total time spent in the executed function, excluding subcalls |
tavg | per-call average total time spent in the executed function. |
index | unique id for the YFuncStat object |
full_name | unique full name of the executed function |