快速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=Falsefast_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

快速转换选项#

除了……之外 TrueFalse ,该参数 fast_reader 也可以是 dict 指定两个附加参数中的任何一个, use_fast_converterexponent_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引擎使用内存映射。如果出于任何原因想避免这种情况,请提供一个打开的文件对象。但是,从时间和内存的角度来看,这通常都不太有效,因为整个文件输入必须一次读取。