【问题标题】:Data locality optimization in PythonPython中的数据局部性优化
【发布时间】:2015-11-03 10:17:46
【问题描述】:

这个问题是关于在 Python 中如何为这个类分配内存的,这个问题更多是出于好奇而不是现实价值。

以下后处理类处理大量数据(numpy 数组)。这是真实代码的简化版本,以使问题可读。来自基类的共享数据现在替换为特征长度变量。

class Reader(object):
    characteristic_length = 1
    def factory(type_name, file_name):
        if type_name == "OFReader": return OFReader(file_name)
        ...
        assert 0, "Bad reader instantiation: " + type_name
...
class OFReader(Reader):
    def __init__(self, of_file_name):
        self.file_name = of_file_name
        self.read_data()
    ....
    def length(self):
        return self.data[:,0] / self.characteristic_length
...

对python处理内存的方式不熟悉,我很好奇将characteristic_length放在子类中是否会大大提高性能?

根据 python 文档,我想派生类实例有一个指向定义基类的地址的指针。如果子类中的查找失败,则在基类中继续查找。这听起来像使用基类属性来存储派生类共享的数据非常昂贵。

在实际应用程序中,共享数据是有点大的 numpy 数组,但对所有派生类都是通用的。懒惰,我想避免分别读取每个子类的数据。有关如何有效解决此问题的任何指示?

【问题讨论】:

    标签: python numpy memory


    【解决方案1】:

    最简单的解决方案是使 numpy 数组成为全局数组。如果您想阻止用户修改该数组,您可以将writable flag 设置为False

    或者,您可以将其设为 Reader 类的类属性。

    【讨论】:

    • 对不起,我对公式不是很清楚,特征长度现在是共享数据的占位符。与其他语言相比,Python 中的 Global 似乎没有那么邪恶。全局和类属性在内存局部性方面如何比较?我猜 global 是一个更高的范围?
    • 老实说,我从不担心 Python 中的内存局部性。只要我的操作系统的 VM 子系统可以处理它,也不会使用内存。这是 python 的基本优势之一;不必担心内存管理。但是,如果您真的担心,请通过 profiling测量这两个选项。这将为您的情况提供明确的答案。 (虽然答案可能是没关系。)
    • 谢谢。将测量和更新。但是,就像你说的,实际上,这并不重要。 IO 需要更长的时间。此外,pypy 很可能是最重要的优化步骤。虽然,内存的优化在那里可能变得很重要。
    • 如果 I/O 是一个瓶颈(考虑到磁盘访问与 RAM 相比要慢多少,这通常是瓶颈),请查看 mmap,这可能会有所帮助。如果您的程序是可并行化的,则将mmapmultiprocessing 结合起来,每个实例都会自行读取数据。一旦第一个 mmap 完成,页面将在缓存中,从而更快地访问其他实例。而且,如果您的资源允许,您总是会在问题上扔一个大 RAM 磁盘或 SSD。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多