我会删除这个问题,因为事实证明这是我的错误。我遇到的瓶颈与网络延迟有关。
<小时/>我有一个 Python 应用程序,它获取包含 4096 个实数的文本文件作为输入。它看起来像这样:
0.3421,0.1215,..........,1.242
无论我尝试什么方法,Python 都需要大约一秒钟的时间才能将文本解析为实际的 Python float 数组。
请注意,我使用的是 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
大约需要 5 毫秒。
使用 JSON 会更快一些:
timeit.timeit('json.loads(s)', number=1000,
setup="import random, json;"
" s = '[' + ','.join(str(random.random())"
" for _ in range(4096)) + ']'")
结果
1.1105524039994634
我。 e. ~1.1ms
关于Python:解析由文本表示的长 double 组非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48081124/