diff --git a/direct/src/showbase/PythonUtil.py b/direct/src/showbase/PythonUtil.py index d67c5d8719..14e2d0a3a8 100644 --- a/direct/src/showbase/PythonUtil.py +++ b/direct/src/showbase/PythonUtil.py @@ -834,9 +834,20 @@ def getProfileResultString(): global _ProfileResultStr return _ProfileResultStr +class PModules: + # holder for modules used by profiling code, avoids import every time code is called + builtin = None + profile = None + os = None + pstats = None + def profile(callback, name, terse, log=True): global _ProfileResultStr - import __builtin__ + if PModules.builtin is None: + import __builtin__ + PModules.builtin = __builtin__ + else: + __builtin__ = PModules.builtin if 'globalProfileFunc' in __builtin__.__dict__: # rats. Python profiler is not re-entrant... base.notify.warning( @@ -926,14 +937,22 @@ def startProfile(filename=PyUtilProfileDefaultFilename, callInfo=1, cmd='run()'): # uniquify the filename to allow multiple processes to profile simultaneously - filename = '%s.%s' % (filename, randUint31()) - import profile + filename = '%s.%s.%s' % (filename, randUint31(), randUint31()) + if PModules.profile is None: + import profile + PModules.profile = profile + else: + profile = PModules.profile profile.run(cmd, filename) if silent: extractProfile(filename, lines, sorts, callInfo) else: printProfile(filename, lines, sorts, callInfo) - import os + if PModules.os is None: + import os + PModules.os = os + else: + os = PModules.os os.remove(filename) # call these to see the results again, as a string or in the log @@ -941,7 +960,11 @@ def printProfile(filename=PyUtilProfileDefaultFilename, lines=PyUtilProfileDefaultLines, sorts=PyUtilProfileDefaultSorts, callInfo=1): - import pstats + if PModules.pstats is None: + import pstats + PModules.pstats = pstats + else: + pstats = PModules.pstats s = pstats.Stats(filename) s.strip_dirs() for sort in sorts: