快速ASCII I/O#
同时 astropy.io.ascii
设计时考虑到灵活性和可扩展性,还有一个不太灵活但速度明显更快的Cython/C引擎来读写ASCII文件。默认情况下, read()
和 write()
将尝试在处理兼容格式时使用此引擎。以下格式当前与fast引擎兼容:
basic
commented_header
csv
no_header
rdb
tab
也可以通过format参数启用fast引擎,方法是在兼容格式的前面加上“fast”和下划线。在这种情况下,或在强制执行快速引擎时 fast_reader='force'
或显式设置 快速转换选项 , read()
如果快速阅读失败,就不会依靠普通读者。
实例#
要打开CSV文件并将其写回:
>>> from astropy.table import Table
>>> t = ascii.read('file.csv', format='fast_csv')
>>> t.write('output.csv', format='ascii.fast_csv')
要禁用快速引擎,请指定 fast_reader=False
或 fast_writer=False
. 例如::
>>> t = ascii.read('file.csv', format='csv', fast_reader=False)
>>> t.write('file.csv', format='csv', fast_writer=False)
备注
猜测和快速阅读
默认情况下 read()
将尝试通过连续尝试不同的格式来猜测输入数据的格式,直到其中一种格式成功(请参阅 猜测表格式 ). 对于每一个支持的快速版本,首先尝试该格式。如果没有任何附加选项,这意味着一些没有快速实现的纯Python读取器和某些读取器的Python版本都将在获得一些快速读取器之前进行尝试。为了完全绕过它们,应该如上所述显式地请求一个快速读取器。
以获得最佳性能 不过,建议完全关闭猜测 (guess=False
)或者通过指定格式(例如。, format='csv'
)和/或其他选项,如分隔符。
阅读#
因为快速引擎不是普通引擎的一部分 astropy.io.ascii
基础结构中,快速读取器在传递某些参数时会引发错误,这些参数在快速读取器基础结构中没有实现。在这种情况下 read()
将依靠普通读卡器,除非明确要求快速读卡器(见上文)。这些参数是:
否定的
header_start
(注释页眉格式除外)否定的
data_start
data_start=None
comment
字符串长度不是1
delimiter
字符串长度不是1
quotechar
字符串长度不是1
converters
outputter_cls
inputter_cls
data_splitter_cls
header_splitter_cls
快速转换选项#
除了……之外 True
和 False
,该参数 fast_reader
也可以是 dict
指定两个附加参数中的任何一个, use_fast_converter
和 exponent_style
。
例子#
使用指定其他参数 fast_reader
::
>>> ascii.read('data.txt', format='basic',
... fast_reader={'use_fast_converter': True})
这些选项允许在启用时更快地读取表,但这两个选项在默认情况下都被禁用,因为它们带有一些警告。
设置 use_fast_converter
成为 True
为浮点值启用更快但稍不精确的转换方法,如下所述。
这个 exponent_style
参数允许定义与默认值不同的字符 'e'
对于输入文件中的指数格式。特殊设置 'fortran'
启用在Fortran表示法下自动检测任何有效的指数字符。有关详细信息,请参阅 Fortran风格指数 .
快速转换器#
理想情况下,输入浮点值应转换为最近的可能的浮点近似值;也就是说,转换应在两个最接近的可表示值之间的一半距离内正确,即0.5 ULP . 普通读卡器和默认的快速读卡器保证在0.5 ULP内转换浮点值,但也有一种更快、更不精确的转换方法,可通过 use_fast_converter
. 如果输入数据的有效数字少于15位,或者精度相对不重要,则在性能关键的情况下,此转换器可能是最佳选择。
对于有效数字数量相当少的值,快速转换器可保证产生最佳转换(在0.5ULP以内)。一旦有效位数超过64位浮点值的精度,快速转换器不再保证在0.5ULP内,但大约60%的值最终在0.5ULP内,约90%在1.0ULP内。
阅读大表#
有关使用快速读取器读取非常大的表的信息,请参阅 分块阅读大表 .
写作#
FAST引擎支持与普通书写引擎相同的功能,通常比普通引擎快两到四倍。速度更快的引擎对整数数据的速度优势最大,对浮点数据的速度优势最小;对于包括浮点、整数和文本数据的混合样本文件,快速引擎的速度大约快3.6倍。还要注意,剥离字符串值会减慢写入过程,因此指定 strip_whitespace=False
可以提高性能。
速度增益#
快速ASCII引擎是基于通用的语法分析策略设计的 Pandas 数据分析库,因此其性能与Pandas大致相当(尽管默认情况下略慢 read_csv
方法。
这个 genfromtxt
和平凡的 astropy.io.ascii
Reader在速度方面非常相似,而 read_csv
略快于用于整数和浮点数据的快速引擎;对于纯浮点数据,启用快速转换器可产生约50%的加速比。还要注意,在转换浮点数据时,Pandas使用与Astropy中的快速转换器完全相同的方法。
对于文本数据,fast引擎和Pandas之间的性能差异取决于数据值重复的程度,因为当每个值都相同时,Pandas的速度几乎是fast引擎的两倍,而在值随机时则相反。这是因为fast引擎对文本数据使用固定大小的NumPy字符串数组,而Pandas使用可变大小的对象数组并使用底层集来避免复制重复的值。
总体而言,快速引擎的速度往往是普通ASCII引擎的四到五倍。如果输入数据非常大(通常约100,000行或更多),特别是如果数据主要不包含整数数据或重复的字符串值。
另一点值得注意的是,如果文件名作为输入提供,fast引擎使用内存映射。如果出于任何原因想避免这种情况,请提供一个打开的文件对象。但是,从时间和内存的角度来看,这通常都不太有效,因为整个文件输入必须一次读取。