Dies ist eine Zeile, die ich aus einer Textdatei gelesen habe:

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

Ich habe readline () verwendet, um es als Zeichenfolge einzulesen. Was ist nun der schnellste Weg, um es wieder in ein Array umzuwandeln?

Vielen Dank!

5
zaolian 4 Dez. 2013 im 02:55

4 Antworten

Beste Antwort

Ich bin mir nicht sicher, ob dies das schnellste ist, aber es ist definitiv das sicherste / einfachste:

import ast
lst = ast.literal_eval(s)

Reguläres eval würde auch funktionieren:

lst = eval(s)

Einige grundlegende Timings von meiner Maschine:

>>> 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

Laut meinem Computer ist eval also ungefähr 50% schneller als ast.literal_eval. eval ist jedoch furchtbar unsicher und sollte niemals für eine Zeichenfolge verwendet werden, es sei denn, Sie vertrauen ihr vollständig. Wenn dies kein wirklich nachweisbarer Engpass ist und Sie der Eingabe zu 100% vertrauen, würde ich die kleine zusätzliche Zeit als Gegenleistung dafür in Betracht ziehen, dass Sie nachts gut schlafen können.

21
mgilson 3 Dez. 2013 im 23:06

Da uns die Geschwindigkeit am Herzen liegt, kann ich in diesem speziellen Fall {{X0} verwenden }:

>>> 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]

(Beachten Sie, dass dies hier funktioniert, da diese Zeile ausreichend JSON-ähnlich ist. Sie kann nicht überall verwendet werden, wo ast.literal_eval dies kann, da nicht die gesamte Python-Literal-Syntax für JSON gültig ist.)

16
DSM 3 Dez. 2013 im 23:10

Ich benutze python 3.6

Hier ist mein Ergebnis einer tatsächlichen Zeichenfolge, die durch spaces getrennt ist.

stringValue = "123 456 789 012 345 678"

String zur Liste

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

Ergebnis

Zeitaufwand 7.586999345221557e-06

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

Zeitaufwand beim Drucken 6.697199933114462e-05

String to List to numpy

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

Ergebnis

Zeitaufwand 2.631999996083323e-05

[76 96 127 255 136 164]

Zeitaufwand für den Druckvorgang 0.002241893000245909

String zu numpy Array

intValue = np.fromstring(stringValue,dtype=int,sep=' ')

Zeitaufwand 1.3830000170855783e-05

[76 96 127 255 136 164]

Zeitaufwand für den Versuch, es zu drucken 0,0003395890007595881

0
Santhosh 4 Mai 2018 im 07:05

Wenn dies die Zeichenfolge ist, klicken Sie hier 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
Giupo 3 Dez. 2013 im 23:10