A basic python import profiler to find bottlenecks in import times. While not often a problem, imports can be an issue for applications that need to start quickly, such as CLI tools. The goal of import profiler is to help find the bottlenecks when importing a given package.
Note: starting from python 3.7, the option -X importtime
can be used for similar
use, and with a better accuracy. See python/cpython#3490
This is Work in Progress. To try it out, write something as follows:
from import_profiler import profile_import
with profile_import() as context:
# Anything expensive in here
import requests
# Print cumulative and inline times. The number of + in the 3rd column
# indicates the depth of the stack.
context.print_info()
Output:
cumtime (ms) intime (ms) name
83 0.5 requests
55 0.5 +packages.urllib3.contrib
54.1 0.3 ++
53.1 0.7 +++connectionpool
6.3 1.1 ++++logging
1.4 0.5 +++++collections
2.7 1.3 +++++threading
1.4 0.3 ++++++re
7 0.7 ++++socket
5.7 5.7 +++++_ssl
7 0.1 ++++packages.ssl_match_hostname
6.9 0.1 +++++
6.8 2.3 ++++++ssl
3.2 1.5 +++++++textwrap
1.7 1.6 ++++++++string
12 0.4 ++++connection
7.7 1.1 +++++httplib
2.3 2.3 ++++++urlparse
4.2 0.2 ++++++mimetools
3.4 0.3 +++++++tempfile
2.1 1.4 ++++++++random
3.6 0.1 +++++util.ssl_
1.1 1 ++++++url
16.4 0.2 ++++request
1.5 1.4 +++++urllib.parse
14.7 0.2 +++++filepost
9.1 6 ++++++uuid
2.9 1.7 +++++++ctypes
5.4 0.2 ++++++fields
4.8 1.7 +++++++email.utils
2.4 0.2 ++++++++email._parseaddr
2.2 0.7 +++++++++calendar
1.4 1.4 ++++++++++locale
1.2 0.4 ++++response
24.8 0.4 +
1.8 1.7 ++cgi
5.4 5.4 ++platform
15.1 0.1 ++compat
2.4 0.2 +++json
1.5 0.5 ++++decoder
1.6 1.3 +++urllib2
7.6 6.8 +++cookielib
3 2.5 +++Cookie
1.5 0.6 +models
1 0.1 +api
We don't track where imports happen: it would be nice to know where a given import in the profile output happens.