假设我初始化一个矩阵如下:矩阵分配到位?
import scipy
m = scipy.zeros((10, 10))
现在,我做了一些计算,我想结果分配到m
。在作业中,m
的大小不会改变,所以我认为如果分配完成就会更快。
m = scipy.array([[i * j for j in range(10)] for i in range(10)])
我担心的是,在上面的代码中,临时矩阵创建保持的结果,然后m
被分配到这个值。这是低效的,因为它涉及分配一个新的矩阵。一个更有效的解决方案是直接存储在m
值,这可能是这样来表达:
for i in range(10):
for j in range(10):
m[i,j] = i * j
但是假设发电机表达对我来说方便多了,因为我已经安排我的代码的方法。
我想知道的是:在上面的生成器表达式中,我在做额外的矩阵分配吗?
如果您习惯于像C这样的语言,则数组分配可能看起来很昂贵,但与CPython的无JIT字节码解释和动态一切的内在开销相比,它的成本低廉。如果您希望NumPy/SciPy代码高效,最关键的是使用NumPy矢量化操作将工作推送到C级循环中,以避免所有这些开销。试图最小化分配并不会有多大帮助,甚至可能会使代码变慢。 – user2357112