pr0*_*n8r 5 python arrays garbage-collection memory-management numpy
我正在尝试调整在计时器上更新的绘图代码(matplotlib)的基础结构,从使用绘图数据的Python列表到使用numpy数组.我希望能够尽可能地缩短绘图的时间步长,并且由于数据可能会达到数千个点,如果我不能,我会开始快速失去宝贵的时间.我知道numpy数组对于这类事情是首选,但我无法弄清楚何时需要像Python程序员一样思考,何时需要像C++程序员一样思考,以最大限度地提高内存访问效率.
它在scipy.org文档中说append()函数,它返回附加在一起的数组的副本.所有这些副本都能正确收集垃圾吗?例如:
import numpy as np
a = np.arange(10)
a = np.append(a,10)
print aRun Code Online (Sandbox Code Playgroud)
这是我对C++级别的内容的阅读,但如果我知道我在说什么,我就不会问这个问题,所以如果我错了请纠正我!= P
首先分配10个整数的块,并且符号a指向该块的开头.然后分配一个包含11个整数的新块,总共使用21个整数(84个字节).然后将a指针移动到11-int块的开头.我的猜测是,这会导致垃圾收集算法将10-int块的引用计数减少到零并解除分配.这是正确的吗?如果没有,我如何确保在追加时不会产生开销?
我也不确定如何在使用它时正确删除numpy数组.我的图上有一个重置按钮,只是刷新所有数据并重新开始.当我有名单时,这是使用完成的del data[:].是否有numpy数组的等效函数?或者我应该只说data = np.array([])并指望垃圾收集器为我做的工作?
Kat*_*iel 10
自动内存管理的重点是你不要考虑它.在您编写的代码中,副本将被垃圾收集(它几乎不可能混淆Python的内存管理).然而,由于np.append不是就地,代码将在内存中创建一个新的数组(含有的级联a和10),然后将变量a将被更新以指向这个新的数组.由于a现在不再指向原始数组,其引用计数为1,因此其引用计数递减为0并将自动清除.您可以使用gc.collect强制完全清理.
Python的优势不在于微调内存访问,尽管可以进行优化.您可能最好按预分配排序a(使用例如a = np.zeros( <size> )); 如果你需要更精细的调整,它开始变得有点毛茸茸.您可以查看Cython + Numpy教程,了解将C与Python集成以实现高效的非常简单的方法.
Python中的变量只指向存储其内容的位置; 你可以使用del任何变量,它会将目标的引用计数减少一个.目标将在其引用计数达到零后自动清理.这样做的道理是,不要担心清理你的记忆.它会自动发生.
| 归档时间: |
|
| 查看次数: |
5605 次 |
| 最近记录: |