Python question - first call is slower?

Python question - first call is slower?

Dan Kenigsberg danken at cs.technion.ac.il
Thu Jun 21 00:17:08 IDT 2012


On Wed, Jun 20, 2012 at 09:20:04AM +0300, Nadav Har'El wrote:
> On Wed, Jun 20, 2012, Meir Kriheli wrote about "Re: Python question - first call is slower?":
> > > I considered, and discredited, the following attempted "explanations":
> >...
> > >   its code gets done in 6 milliseconds; It's not a 12 millisecond pause
> > >   and then the rest of the function finishes in 2ms.
> > >
> > 
> > Yeah, compiles to bytecode.
> 
> As far as I understand, the code is "compiled to bytecode" when it is
> imported, *not* when it is first run, so it doesn't explain why the
> first run of a function is slower. If you think it's otherwise, please
> let me know.
> 
> > Nitpick: CPython doesn't (the one you're referring to as Python), other
> > implementations may and will (PyPy, Jython, etc)
> 
> Yes, I'm talking about the "python" executable, which I guess is
> CPython.
> 
> > > 3. "If class A imports B which imports C which imports D, some of these
> > >   classes are only read when the code is actually used for the first
> > >   time". Again, I couldn't find any evidence that this is true in Python
> > >   (unlike, e.g., Java). An "import" would read the whole class hierarchy
> > > into
> > >   memory. Right?
> > A module is loaded only once (see also: sys.modules)
> 
> Yes, this I know. But at first I thought maybe it is loaded lazily
> somehow, so some things are loaded only when a function from the module
> is actually run. But I can find no evidence of that - every bit of
> documentation I can find suggests that the module, and every module it
> refers to, recursively, are fully loaded at the time of the "import" of
> the top module.
> 

I think Meir's point is that if your code eventually calls an stdlib function
like

def f():
    import foo
    return foo.bar()

the first call to the function would require a tedious load of foo.py,
which would be avoided on the second call.

I guess that `strace -eopen python` would reveal plenty of open(2)s during the
first computation.

Dan.



More information about the Linux-il mailing list