繁体   English   中英

有没有办法获得python array.array()的视图?

[英]Is there a way to get a view into a python array.array()?

我正在生成许多大的“随机”文件(~500MB),其中的内容是对random.randint(...)重复调用的输出。 我想预先分配一个大缓冲区,将long写入该缓冲区,并定期将该缓冲区刷新到磁盘。 我目前正在使用array.array()但我看不到在此缓冲区中创建视图的方法。 我需要这样做,以便我可以将有效数据的缓冲区部分提供给hashlib.update(...) ,并将缓冲区的有效部分写入文件。 我可以使用切片操作符,但是AFAICT可以创建缓冲区的副本,这不是我想要的。

有没有办法做到这一点,我没有看到?

更新:

我使用numpy作为user42005和hgomersall建议。 不幸的是,这并没有给我提供我想要的加速。 我的简单的C程序在11s内生成~700MB的数据,而我的python等效使用numpy需要大约700s! 很难相信这两者之间的表现差异(我更可能相信我在某处犯了一个天真的错误......)

我想你可以使用numpy: http ://www.numpy.org- numpy中的基本数组类型至少支持无副本视图。

Numpy具有令人难以置信的灵活性和强大功能,在查看阵列时可以最大限度地减少副本。 例如:

import numpy
a = numpy.random.randint(0, 10, size=10)
b = numpy.a[3:10]

b现在是创建的原始数组的视图。

Numpy数组允许所有方式直接访问数据缓冲区,并且可以简单地进行类型转换。 例如:

a = numpy.random.randint(0, 10, size=10)
b = numpy.frombuffer(a.data, dtype='int8')

b现在以数据全部作为8位整数查看存储器(数据本身保持不变,因此每个64位int现在变为8个8位整数)。 这些缓冲区对象(来自a.data)是标准的python缓冲区对象,因此可以在定义为使用缓冲区的所有位置使用。

多维数组也是如此。 但是,您必须牢记数据在内存中的位置。 例如:

a = numpy.random.randint(0, 10, size=(10, 10))
b = numpy.frombuffer(a[3,:].data, dtype='int8')

会工作,但是

b = numpy.frombuffer(a[:,3].data, dtype='int8')

返回有关无法获取不连续数组的单段缓冲区的错误。 这个问题并不明显,因为只需使用相同的视图分配给变量

b  = a[:,3]

返回一个完全足够的numpy数组。 但是,它在内存中不是连续的,因为它是另一个数组的视图,它不需要(在这种情况下不是)连续内存的视图。 您可以使用数组上的flags属性获取有关该数组的信息:

a[:,3].flags

返回(除此之外)C_CONTIGUOUS(C order,row major)和F_CONTIGUOUS(Fortran order,column major)为False,但是

a[3,:].flags

将它们返回为True(在2D数组中,最多其中一个可以为真)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM