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

时间:2013-12-03 22:55:10

标签: python string list

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

[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]

我使用readline()以字符串形式读取它。现在将它转换回数组的最快方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:21)

我不确定这是最快的,但它绝对是最安全/最简单的:

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

因此,根据我的计算机,evalast.literal_eval快约50%。但是,eval非常不安全,除非您完全信任,否则不应在任何字符串上使用它。除非这是一个真正的可证明的瓶颈,并且你相信输入的100%,我会考虑一点点额外的时间来换取晚上能够安然入睡。

答案 1 :(得分:16)

由于我们关心速度,在这种特殊情况下我可能会使用json.loads

>>> import ast, json
>>> s = "[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]"
>>> %timeit ast.literal_eval(s)
10000 loops, best of 3: 61.6 µs per loop
>>> %timeit eval(s)
10000 loops, best of 3: 45.7 µs per loop
>>> %timeit json.loads(s)
100000 loops, best of 3: 6.61 µs per loop
>>> json.loads(s)
[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]

(请注意,这可以在这里工作,因为这一行与JSON类似。它不能在ast.literal_eval可以使用的任何地方使用,因为并非所有Python文字语法都是有效的JSON。)

答案 2 :(得分:3)

如果是字符串,请转到此处http://docs.python.org/2/library/functions.html#eval

>>> s = "[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]"
>>> eval(s)
[54, 95, 45, -97, -51, 84, 0, 32, -55, 14, 50, 54, 68, -3, 57, 88, -1]

答案 3 :(得分:0)

我正在使用python 3.6

以下是我用spaces

分隔的实际字符串的结果
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