Ein einfaches Problem, wirklich: Sie haben eine Milliarde (1e + 9) vorzeichenlose 32-Bit-Integer als dezimale ASCII-Strings in einer TSV (Tab-getrennte Werte) -Datei gespeichert. Die Konvertierung mit int()
ist schrecklich langsam im Vergleich zu anderen Tools, die an demselben Datensatz arbeiten. Warum? Und noch wichtiger: Wie kann ich es schneller machen?Schnelle Umwandlung von String in Integer in Python
Daher die Frage: Was ist der schnellste Weg, um eine Zeichenfolge in eine Ganzzahl in Python zu konvertieren?
Worüber ich wirklich nachdenke, ist eine halb verborgene Python-Funktionalität, die (ab) für diesen Zweck verwendet werden könnte, nicht anders als Guidos Verwendung von array.array
in seinem "Optimization Anecdote".
Probendaten (mit Tabs zu Räumen erweitert)
38262904 "pfv" 2002-11-15T00:37:20+00:00
12311231 "tnealzref" 2008-01-21T20:46:51+00:00
26783384 "hayb" 2004-02-14T20:43:45+00:00
812874 "qevzasdfvnp" 2005-01-11T00:29:46+00:00
22312733 "bdumtddyasb" 2009-01-17T20:41:04+00:00
Die Zeit, die die Daten zu lesen braucht hier nicht relevant ist, wird die Datenverarbeitung der Engpass.
Microbenchmarks
alle der folgenden Sprachen interpretiert. Auf dem Hostcomputer wird 64-Bit-Linux ausgeführt.
Python 2.6.2 mit IPython 0.9.1, ~ 214K Umwandlungen pro Sekunde (100%):
In [1]: strings = map(str, range(int(1e7)))
In [2]: %timeit map(int, strings);
10 loops, best of 3: 4.68 s per loop
REBOL 3.0 Version 2.100.76.4.2, ~ 231kcps (108%):
>> strings: array n: to-integer 1e7 repeat i n [poke strings i mold (i - 1)]
== "9999999"
>> delta-time [map str strings [to integer! str]]
== 0:00:04.328675
REBOL 2.7.6.4.2 (15-Mar-2008), ~ 523kcps (261%):
Als John in den Kommentaren erwähnt, diese Version hat keine Liste der konvertierten Zahlen bauen, so die Geschwindigkeit- Verhältnis gegeben ist relativ zu Pythons 4.99s Laufzeit von for str in strings: int(str)
.
>> delta-time: func [c /local t] [t: now/time/precise do c now/time/precise - t]
>> strings: array n: to-integer 1e7 repeat i n [poke strings i mold (i - 1)]
== "9999999"
>> delta-time [foreach str strings [to integer! str]]
== 0:00:01.913193
KDB + 2.6T 2009.04.15, ~ 2016kcps (944%):
q)strings:string til "i"$1e7
q)\t "I"$strings
496
Versuchen Sie 'numpy.fromfile', um 'eine Milliarde positive ganze Zahlen' zu laden (was meinen Sie mit 'Milliarden' (es ist '10 ** 9 'in den USA, es könnte' 10 ** 12 'sein) Großbritannien)? – jfs
Guter Fang über die Milliarde, auch wenn letzteres in den 1970er Jahren in Großbritannien aus der Mode kam. – earl
Haben Sie versucht, den Code zu kompilieren? –