我正在尝试调整在计时器上更新的绘图代码(matplotlib)的底层结构,从使用 Python 列表绘制数据到使用 numpy 数组。我希望能够尽可能降低绘图的时间步长,并且由于数据可能会达到数千个点,如果不能的话,我就会开始快速浪费宝贵的时间。我知道 numpy 数组更适合这类事情,但我很难弄清楚何时需要像 Python 程序员一样思考,何时需要像 C++ 程序员一样思考以最大限度地提高内存访问效率。
在 scipy.org 文档中,append() 函数表示它返回附加在一起的数组的副本。所有这些副本是否都得到正确的垃圾收集?例如:
import numpy as np
a = np.arange(10)
a = np.append(a,10)
print a
这是我对 C++ 级别发生的事情的阅读,但如果我知道我在说什么,我就不会问这个问题,所以如果我错了,请纠正我! =P
首先分配 10 个整数的块,符号 a 指向该块的开头。然后分配一个包含 11 个整数的新块,总共使用 21 个整数(84 字节)。然后 a 指针被移动到 11-int 块的开头。我的猜测是,这将导致垃圾收集算法将 10-int 块的引用计数减少到零并取消分配它。这是正确的吗?如果不是,如何确保附加时不会产生开销?
我也不确定在使用完 numpy 数组后如何正确删除它。我的绘图上有一个重置按钮,它只会清除所有数据并重新开始。当我有列表时,这是使用完成的del data[:]
。 numpy 数组有等效的函数吗?或者我应该只说 data = np.array([]) 并依靠垃圾收集器来为我完成工作?
自动内存管理的要点是你不需要考虑它。在您编写的代码中,副本将被很好地进行垃圾收集(几乎不可能混淆 Python 的内存管理)。然而,因为np.append
不是就地,代码将在内存中创建一个新数组(包含a
and 10
)然后是变量a
将更新为指向这个新数组。自从a
现在不再指向引用计数为 1 的原始数组,其引用计数将递减为 0,并且将自动清除。您可以使用gc.collect http://docs.python.org/library/gc.html#gc.collect强制进行全面清理。
Python 的优势并不在于微调内存访问,尽管可以进行优化。您可能是最好的预分配排序a
(使用例如a = np.zeros( <size> )
);如果你需要比这更精细的调整,它就会开始变得有点毛茸茸的。你可以看看Cython + Numpy 教程 http://wiki.cython.org/tutorials/numpy以一种非常简洁的方式将 C 与 Python 集成以提高效率。
Python中的变量只是指向其内容存储的位置;你可以del
任何变量都会将其目标的引用计数减一。当目标的引用计数为零后,目标将被自动清理。这样做的寓意是,不要担心清理你的记忆。它会自动发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)