在python中,将字符串转换为数组的最快方法是什么?

在python中,将字符串转换为数组的最快方法是什么?,python,string,list,Python,String,List,这是我从文本文件中读取的一行: [54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1] 我使用readline()将其作为字符串读入。现在,将其转换回阵列的最快方法是什么 谢谢大家! 我不确定这是最快的,但肯定是最安全/最容易的: import ast lst = ast.literal_eval(s) 常规eval也可以: lst = eval(s) 我的机器的一些基本计时: >>>

这是我从文本文件中读取的一行:

[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]
我使用readline()将其作为字符串读入。现在,将其转换回阵列的最快方法是什么


谢谢大家!

我不确定这是最快的,但肯定是最安全/最容易的:

import ast
lst = ast.literal_eval(s)
常规
eval
也可以:

lst = eval(s)
我的机器的一些基本计时:

>>> s = '[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]' 
>>> def f1():
...    eval(s)
... 
>>> def f2():
...    ast.literal_eval(s)
... 
>>> timeit.timeit('f1()', 'from __main__ import f1')
31.415852785110474
>>> timeit.timeit('f2()', 'from __main__ import f2')
46.25958704948425

因此,根据我的电脑,
eval
ast.literal\u eval
快50%。但是,
eval
是非常不安全的,除非您完全信任它,否则不应在任何字符串上使用它。除非这是一个真正的可演示的瓶颈,你相信输入100%,我会考虑一点额外的时间来换取能在晚上睡个好觉。
由于我们关心速度,在这种特殊情况下,我可能会使用:


(请注意,这在这里是有效的,因为这一行非常类似于JSON。它不能在
ast.literal\u eval
可以的任何地方使用,因为并非所有Python文本语法都是有效的JSON。)

我使用的是
Python 3.6

这是我对一个由
空格分隔的实际字符串的结果

stringValue = "123 456 789 012 345 678"
要列出的字符串

intValue = list(map(int, stringValue.split(' ')))
结果

所用时间7.586999345221557e-06

[76,96,127,255,136,164]

尝试打印它所花费的时间6.697199933114462e-05

要列表到numpy的字符串

intValue = np.array(list(map(int, stringValue.split(' '))))
结果

所用时间2.631999996083323e-05

[76 96 127 255 136 164]

尝试打印它所花费的时间0.002241893000245909

字符串到numpy数组

intValue = np.fromstring(stringValue,dtype=int,sep=' ')
所用时间1.3830000170855783e-05

[76 96 127 255 136 164]

尝试打印它所花费的时间0.0003395890007595881


您有一个
列表
,而不是
数组
。两者之间存在微妙的差异……而且是迄今为止最安全的<代码>评估
可能是最快的。@JonathonReinhart——是的,说真的。我不确定我是否见过它涨得那么快。@mgilson她就是这么说的。@TimPeters——你说得对
timeit
显示
eval
在我的机器上大约快50%。eval的使用令人不安@ᴋᴇʏsᴇ当然,我接受这个建议,但我不同意解释
eval
。它就在那里,在我发布的官方python文档中,我想去那里阅读比在这里重复一段信息更有教育意义(而且它也更“pythonic”)。我不是说它是一个不好的链接:p(它肯定不是),我只是说你至少应该有一句元文本:)酷!我想不到-令人印象深刻:-)当然DSM。。。我给出了一个很好的答案,然后你就必须去战胜它。谢谢你(因为荣誉不是StackOverflow货币的官方单位,+1和它一起)。我更喜欢使用json的解决方案,因为使用eval可能会导致严重的错误。
intValue = np.array(list(map(int, stringValue.split(' '))))
intValue = np.fromstring(stringValue,dtype=int,sep=' ')