[Numpy-discussion] "import numpy" performance
Paul Ivanov
pivanov314 at gmail.com
Tue Jul 3 19:47:20 EDT 2012
On Mon, Jul 2, 2012 at 2:59 PM, Nathaniel Smith <njs at pobox.com> wrote:
> On Mon, Jul 2, 2012 at 10:06 PM, Robert Kern <robert.kern at gmail.com> wrote:
>> On Mon, Jul 2, 2012 at 9:43 PM, Benjamin Root <ben.root at ou.edu> wrote:
>>>
>>> On Mon, Jul 2, 2012 at 4:34 PM, Nathaniel Smith <njs at pobox.com> wrote:
>>
>>>> I think this ship has sailed, but it'd be worth looking into lazy
>>>> importing, where 'numpy.fft' isn't actually imported until someone
>>>> starts using it. There are a bunch of libraries that do this, and one
>>>> would have to fiddle to get compatibility with all the different
>>>> python versions and make sure you're not killing performance (might
>>>> have to be in C) but something along the lines of
>>>>
>>>> class _FFTModule(object):
>>>> def __getattribute__(self, name):
>>>> mod = importlib.import_module("numpy.fft")
>>>> _FFTModule.__getattribute__ = mod.__getattribute__
>>>> return getattr(mod, name)
>>>> fft = _FFTModule()
>>>
>>> Not sure how this would impact projects like ipython that does
>>> tab-completion support, but I know that that would drive me nuts in my basic
>>> tab-completion setup I have for my regular python terminal. Of course, in
>>> the grand scheme of things, that really isn't all that important, I don't
>>> think.
>>
>> We used to do it for scipy. It did interfere with tab completion. It
>> did drive many people nuts.
>
> Sounds like a bug in your old code, or else the REPLs have gotten
> better? I just pasted the above code into both ipython and python
> prompts, and typing 'fft.<tab>' worked fine in both cases. dir(fft)
> works first try as well.
>
> (If you try this, don't forget to 'import importlib' first, and note
> importlib is 2.7+ only. Obviously importlib is not necessary but it
> makes the minimal example less tedious.)
For anyone interested, I worked out a small lazy-loading class that
we use in nitime [1], which does not need importlib and thus works
on python versions before 2.7 and also has a bit of repr pretty
printing.
I wrote about this to Scipy-Dev [2], and in the original nitime
PR [3] tested that it works in python 2.5, 2.6, 2.7, 3.0, 3.1 and
3.2.
Since that time, we've only changed how we deal with the one
known limitation: reloading a lazily-loaded module was a noop in
that PR, but now throws an error (there's one line commented out
if the noop behavior is preferred).
Here's a link to the rendered docs [4], but if you just grab the
LazyImport class from [1], you can do
fft = LazyImport('numpy.fft')
1. https://github.com/nipy/nitime/blob/master/nitime/lazyimports.py
2. http://mail.scipy.org/pipermail/scipy-dev/2011-September/016606.html
3. https://github.com/nipy/nitime/pull/88
4. http://nipy.sourceforge.net/nitime/api/generated/nitime.lazyimports.html#module-nitime.lazyimports
best,
--
Paul Ivanov
314 address only used for lists, off-list direct email at:
http://pirsquared.org | GPG/PGP key id: 0x0F3E28F7
More information about the NumPy-Discussion
mailing list