May*_*ava 5 python optimization memory-management numpy scipy
对于在numpy/scipy中进行重复操作,会产生大量开销,因为大多数操作都会返回一个新对象.
例如
for i in range(100):
x = A*x
Run Code Online (Sandbox Code Playgroud)
我想通过传递对操作的引用来避免这种情况,就像在C中一样
for i in range(100):
np.dot(A,x,x_new) #x_new would now store the result of the multiplication
x,x_new = x_new,x
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我想这不仅仅是为了复制,而是所有返回矩阵或向量的操作.
请参阅IPython 书籍中的学习避免不必要的数组副本。从那里,请注意以下准则:
a *= b
Run Code Online (Sandbox Code Playgroud)
不会产生副本,而:
a = a * b
Run Code Online (Sandbox Code Playgroud)
将产生一个副本。另外,flatten()将复制,而ravel()仅在必要时复制,否则返回视图(因此通常应该是首选)。reshape()也不会产生副本,而是返回视图。
此外,正如 @hpaulj 和 @ali_m 在他们的评论中指出的那样,许多 numpy 函数支持out参数,所以请查看文档。来自numpy.dot() 文档:
out :ndarray,可选输出参数。
它必须具有与未使用时将返回的确切类型。特别是,它必须具有正确的类型,必须是 C 连续的,并且其数据类型必须是为点(a,b) 返回的数据类型。这是一个性能特征。因此,如果不满足这些条件,则会引发异常,而不是尝试灵活处理。
| 归档时间: |
|
| 查看次数: |
439 次 |
| 最近记录: |