  Existing profilers for scripting languages (a.k.a. "glue" languages) like
Python suffer from numerous problems that drastically limit their usefulness.
They impose order-of-magnitude overheads, report information at too coarse a
granularity, or fail in the face of threads. Worse, past
profilers---essentially variants of their counterparts for C---are oblivious to
the fact that optimizing code in scripting languages requires information about
code spanning the divide between the scripting language and libraries written
in compiled languages.
  This paper introduces scripting-language aware profiling, and presents
Scalene, an implementation of scripting-language aware profiling for Python.
Scalene employs a combination of sampling, inference, and disassembly of
byte-codes to efficiently and precisely attribute execution time and memory
usage to either Python, which developers can optimize, or library code, which
they cannot. It includes a novel sampling memory allocator that reports
line-level memory consumption and trends with low overhead, helping developers
reduce footprints and identify leaks. Finally, it introduces a new metric, copy
volume, to help developers root out insidious copying costs across the
Python/library boundary, which can drastically degrade performance. Scalene
works for single or multi-threaded Python code, is precise, reporting detailed
information at the line granularity, while imposing modest overheads
(26%--53%).
