Consequences of importing the same module multiple times in C++?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Robert Dailey

    #1

    Consequences of importing the same module multiple times in C++?

    Hi,

    I'm currently using boost::python:: import() to import Python modules,
    so I'm not sure exactly which Python API function it is calling to
    import these files. I posted to the Boost.Python mailing list with
    this question and they said I'd probably get a better answer here, so
    here it goes...

    If I do the following:

    using namespace boost::python;
    import( "__main__" ).attr( "new_global " ) = 40.0f;
    import( "__main__" ).attr( "another_global " ) = 100.0f:

    Notice that I'm importing twice. What would be the performance
    consequences of this? Do both import operations query the disk for the
    module and load it into memory? Will the second call simply reference
    a cached version of the module loaded at the first import() call?

    Thanks.
  • Lie Ryan

    #2
    Re: Consequences of importing the same module multiple times in C++?

    On Fri, 24 Oct 2008 12:23:18 -0700, Robert Dailey wrote:
    Hi,
    >
    I'm currently using boost::python:: import() to import Python modules, so
    I'm not sure exactly which Python API function it is calling to import
    these files. I posted to the Boost.Python mailing list with this
    question and they said I'd probably get a better answer here, so here it
    goes...
    >
    If I do the following:
    >
    using namespace boost::python;
    import( "__main__" ).attr( "new_global " ) = 40.0f; import( "__main__"
    ).attr( "another_global " ) = 100.0f:
    >
    Notice that I'm importing twice. What would be the performance
    consequences of this? Do both import operations query the disk for the
    module and load it into memory? Will the second call simply reference a
    cached version of the module loaded at the first import() call?
    >
    Thanks.
    I think it does not reload the module. Running python with verbose mode:

    blah@blah-laptop:~$ python -v
    (snip)
    >>import xml
    import xml # directory /usr/local/lib/python2.6/xml
    # /usr/local/lib/python2.6/xml/__init__.pyc matches /usr/local/lib/
    python2.6/xml/__init__.py
    import xml # precompiled from /usr/local/lib/python2.6/xml/__init__.pyc
    >>import xml
    >>>
    It's also mentioned in the docs: (paraphrased to clarify the points)
    '''
    The system maintains a table of modules that have been ...
    initialized.... When a module name is found..., step (1) is finished. If
    not, a search for a module ... . When ... found, it is loaded.
    '''
    The official home of the Python Programming Language


    Comment

    • Aaron Brady

      #3
      Re: Consequences of importing the same module multiple times in C++?

      On Oct 24, 2:23 pm, Robert Dailey <rcdai...@gmail .comwrote:
      Hi,
      >
      I'm currently using boost::python:: import() to import Python modules,
      so I'm not sure exactly which Python API function it is calling to
      import these files. I posted to the Boost.Python mailing list with
      this question and they said I'd probably get a better answer here, so
      here it goes...
      >
      If I do the following:
      >
      using namespace boost::python;
      import( "__main__" ).attr( "new_global " ) = 40.0f;
      import( "__main__" ).attr( "another_global " ) = 100.0f:
      >
      Notice that I'm importing twice. What would be the performance
      consequences of this? Do both import operations query the disk for the
      module and load it into memory? Will the second call simply reference
      a cached version of the module loaded at the first import() call?
      >
      Thanks.
      Docs:

      Note
      For efficiency reasons, each module is only imported once per
      interpreter session. Therefore, if you change your modules, you must
      restart the interpreter – or, if it’s just one module you want to test
      interactively, use reload(), e.g. reload(modulena me).

      Comment

      Working...