优化从python将ctypes浮点数组作为字节流写入文件的过程

优化从python将ctypes浮点数组作为字节流写入文件的过程,python,arrays,io,ctypes,writefile,Python,Arrays,Io,Ctypes,Writefile,我目前处理将数据写入文件的方式确实存在一个小问题。 数据存储为ctypes指针,指向已知大小(超过1亿)的浮点数组。 该文件本身应该是一个原始文件,其中包含一定数量的头信息以及上述卷数据的unsigned int表示形式 我目前所做的(打开文件并写入标题信息后)是: 体素数据是一个ctypes结构,在变量“dataset_p”中包含一个ctypes浮点数组指针(以及其他数据)。这是我需要存储为无符号整数字节的数据 虽然我当前的实现只在find中工作,但它非常慢,保存文件不应该像这样慢 在循环之前

我目前处理将数据写入文件的方式确实存在一个小问题。 数据存储为ctypes指针,指向已知大小(超过1亿)的浮点数组。 该文件本身应该是一个原始文件,其中包含一定数量的头信息以及上述卷数据的unsigned int表示形式

我目前所做的(打开文件并写入标题信息后)是:

体素数据是一个ctypes结构,在变量“dataset_p”中包含一个ctypes浮点数组指针(以及其他数据)。这是我需要存储为无符号整数字节的数据

虽然我当前的实现只在find中工作,但它非常慢,保存文件不应该像这样慢

在循环之前,我已经尝试过批量完成从float到uint的整个转换,但我似乎无法再让它与c_uint8转换一起工作,而是抛出了一个TypeError(“只有lenght-1数组可以转换为Python标量”)


感谢您提供的任何帮助。如果有什么不清楚的地方,请毫不犹豫地询问。

这是Python 2还是Python 3?您有可用的NumPy吗?在第一次转换并将组或块存储在数组中之后,您可以一次写入多个(1K-4K)像素来提高性能,可能会提高很多。@eryksun:这是Python 3,我可以访问NumPy。马蒂诺:我会试试这个,但为什么它会提高性能,因为每个像素上执行的单个操作数量相同?写函数有这么慢(开销这么大)?试试
f.write((255*numpy.frombuffer(texVolume.dataset\u p[0],dtype='float32')).astype('uint8'))
。还可以考虑通过使用一个更大的缓冲区文件,通过<代码>缓冲=65536 < /代码>到<代码>打开< /代码>函数。这比默认的缓冲区大小大8到16倍。从quick time.time()测试:original:84.4s buffer:84.1s numpy:0.6s np+buf:0.57这是Python 2还是Python 3?您有可用的NumPy吗?在第一次转换并将组或块存储在数组中之后,您可以一次写入多个(1K-4K)像素来提高性能,可能会提高很多。@eryksun:这是Python 3,我可以访问NumPy。马蒂诺:我会试试这个,但为什么它会提高性能,因为每个像素上执行的单个操作数量相同?写函数有这么慢(开销这么大)?试试
f.write((255*numpy.frombuffer(texVolume.dataset\u p[0],dtype='float32')).astype('uint8'))
。还可以考虑通过使用一个更大的缓冲区文件,通过<代码>缓冲=65536 < /代码>到<代码>打开< /代码>函数。这比默认的缓冲区大小大8到16倍。通过快速计时。time()测试:原始:84.4s缓冲区:84.1s numpy:0.6s np+buf:0.57s
texVolume = voxelData.from_address(ptr.as_pointer())
for pixel in texVolume.dataset_p.contents:
    f.write(c_uint8(int(pixel*255)))
f.close()