假设我在一个名为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,但这真的很难阅读,所以也许我错过了它。如果有人能给我一个正确的方向,我会很高兴。
答案 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
是一个变量。