命名空间混淆和包装

时间:2015-10-03 19:44:34

标签: python numpy namespaces

很可能这个问题之前被问过,但到目前为止我一无所知。

假设我在一个名为test.py的文件中有一些代码(这是我昨天的问题Wrapping np.arrays __pow__ method的结果)

import numpy as np
from functools import wraps, reduce

#Create a subclass of np.ndarray to speed up the power operation
class MyArray(np.ndarray):
  def __pow__(self, other):
    return reduce(lambda x,y: x*y, [self for _ in range(other)])

#Create a wrapper so that arrays are created using my Class instead of the old one.    
def change_ndarray(func):
  @wraps(func)
  def wrapper(*args, **kwargs):
    return func(*args, **kwargs).view(MyArray)
  return wrapper    

np.array = change_ndarray(np.array)

到目前为止,它在我的文件中运行得很好,每个数组都是使用包装的np.array生成的。但后来比较速度增益我感到困惑:

>>> import numpy as np
>>> %timeit np.linspace(10,1000,1000000)**3
10 loops, best of 3: 154 ms per loop
>>> import test
>>> %timeit np.linspace(10,1000,1000000)**3
10 loops, best of 3: 40.6 ms per loop

为什么linspace现在与包装的ndarray而不是旧的ndarray一起工作? np.linspace现在如何调用t.np.array怎么样?我认为这是另一个命名空间,linspace与np.array有什么关系?

作为一个注释,我通读了https://docs.python.org/3/reference/import.html,但这真的很难阅读,所以也许我错过了它。如果有人能给我一个正确的方向,我会很高兴。

1 个答案:

答案 0 :(得分:1)

test.py 中,valid会将{ali np.array = change_ndarray(np.array)模块中的array变量重新指定为numpy。使用np的所有代码现在都使用您放入其中的新内容。 numpy.array等操作在本地模块中创建新变量,但from numpy import *仅为您提供模块本身的引用。

考虑python变量的工作原理。命名空间是python dicts ,它存储键(变量名)/值(变量引用的对象)对。命名空间与方法和函数(局部变量),类(类变量)和模块(模块全局变量)相关联。当你使用一个变量时,python在几个命名空间 dicts 中查找名称并返回它的对象。 import numpy as np表示查找名为np.array的变量,获取其名称空间 dict ,然后在那里查看np。在您的情况下,array numpy 模块,np是一个变量。