Python:解析由文本表示的长双数组非常慢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:解析由文本表示的长双数组非常慢相关的知识,希望对你有一定的参考价值。

我会删除这个问题,因为事实证明这是我的错误。我遇到的瓶颈与网络延迟有关。


我有一个Python应用程序,它将一个包含4096个实数的文本文件作为输入。它看起来像这样:

0.3421,0.1215,..........,1.242

无论我尝试什么方法,都需要Python大约一秒钟才能将文本解析为实际的浮点数Python数组。

请注意,我使用的是Python 3.5

到目前为止我试过:

手动解析并使用列表推导创建列表:

arr = [float(val) for val in text.split(',')]

附加'['和']'包装标志并使用eval函数:

arr = eval('[' + text + ']')

附加'['和']'包装标志并使用json.loads函数:

import json
arr = json.loads('[' + text + ']')

创建Numpy字符串数组并将其数据类型转换为float:

import numpy as np
arr = np.array(text.split(',')).astype(np.float)

使用Numpy的fromstring方法

import numpy as np
arr = np.fromstring(text, sep=',')

这些选项都没有比一秒钟更快。

如何让它更快地转换?

答案

我想你不知怎的错了。这是我的结果:

import timeit

timeit.timeit('eval(s)', number=1000,
              setup="import random;"
                    " s = '[' + ','.join(str(random.random())"
                                        " for _ in range(4096)) + ']'")

结果是

4.92162881999684

这意味着使用字符串的简单eval需要大约5ms。

使用JSON它会更快一些:

timeit.timeit('json.loads(s)', number=1000,
              setup="import random, json;"
                    " s = '[' + ','.join(str(random.random())"
                                        " for _ in range(4096)) + ']'")

结果是

1.1105524039994634

一世。即〜1.1ms

另一答案

像所有其他计算机应用程序一样,Python具有它的限制,如here所示。 1秒实际上是计算4096个数字数组的好时机,考虑到它每1/4096秒经过一个值。

以上是关于Python:解析由文本表示的长双数组非常慢的主要内容,如果未能解决你的问题,请参考以下文章

python中的长文本作为字符串

使用python3.7进行慢列表解析以去除重复项

最小表示法,以及二维数组的比较方法

在没有数组的长序列中搜索模式字符串[关闭]

python计算长方形面积 青少年编程电子学会python编程等级考试一级真题解析2021-3

python使用textwrap包在已经生成的长字符串中嵌入回车符实战