Ich war von diesem Problem fasziniert und wollte die Generierung beliebiger Bereiche untersuchen. Ich habe festgestellt, dass Hex-Formatierung im Allgemeinen der Flaschenhals und String-Formatierung/Verkettung ist.
Es gibt Möglichkeiten, wie dieser Code weiter optimiert werden könnte. Abgesehen davon wollte ich Dable mit Nachschlagetabellen und bitweisen Operationen.
Diese Lösungen verwenden zur Laufzeit etwa 10 MB RAM. Wenn die Liste wurde unter Verwendung einer Liste Verständnis materialisiert es über 1 GB verwendet und dauert länger ...
Meine beste Lösung bisher berechnet pre hex Codierungen in eine Liste. 2 Hex-Bereiche werden pro Nachschlagetabelle codiert, um den Treffer der Zeichenfolgenformatierung zu vermeiden. Wenn ich versuchte, mehr Hexadezimalziffern in einer Zeichenfolge zu verwenden, wurde die Nachschlagetabelle zu groß und auch das Tool wurde länger generiert, als die Funktionen zum Ausführen benötigten.
Schnellste, weil es etwa halb so viele Saiten
from itertools import product
def generate_macs(first, last):
begin = int(first.replace(':', ''), 16)
end = int(last.replace(':', ''), 16) + 1
look_co = ['%02X:%02X:' % i for i in product(xrange(0x00, 0x100), repeat=2)]
look_ln = ['%02X:%02X\n' % i for i in product(xrange(0x00, 0x100), repeat=2)]
return (look_co[i >> 32 & 0xFFFF] + \
look_co[i >> 16 & 0xFFFF] + \
look_ln[i & 0xFFFF] for i in xrange(begin, end))
Andere Versionen verwenden Zeichenfolge Formatierung oder 2hexdigit Gruppierungen String verketteten behandelt.
reine Hex Formatierung
def generate_macs(first, last):
begin = int(first.replace(':', ''), 16)
end = int(last.replace(':', ''), 16) + 1
return ('%02X:%02X:%02X:%02X:%02X:%02X\n' % (
i >> 40 & 0xFF,
i >> 32 & 0xFF,
i >> 24 & 0xFF,
i >> 16 & 0xFF,
i >> 8 & 0xFF,
i & 0xFF) for i in xrange(begin, end))
2Hex Digits pro Lookup-Zeichenfolge concated
def generate_macs(first, last):
begin = int(first.replace(':', ''), 16)
end = int(last.replace(':', ''), 16) + 1
look_co = ['%02X:' % i for i in xrange(0x00, 0x100)]
look_ln = ['%02X\n' % i for i in xrange(0x00, 0x100)]
return (look_co[i >> 40 & 0xFF] + \
look_co[i >> 32 & 0xFF] + \
look_co[i >> 24 & 0xFF] + \
look_co[i >> 16 & 0xFF] + \
look_co[i >> 8 & 0xFF] + \
look_ln[i & 0xFF] for i in xrange(begin, end))
2Hex Digits pro String-Suche
def generate_macs(first, last):
begin = int(first.replace(':', ''), 16)
end = int(last.replace(':', ''), 16) + 1
look_co = ['%02X:' % i for i in xrange(0x00, 0x100)]
look_ln = ['%02X\n' % i for i in xrange(0x00, 0x100)]
return (''.join((look_co[i >> 40 & 0xFF],
look_co[i >> 32 & 0xFF],
look_co[i >> 24 & 0xFF],
look_co[i >> 16 & 0xFF],
look_co[i >> 8 & 0xFF],
look_ln[i & 0xFF])) for i in xrange(begin, end))
beitreten
-Code verwendet es
f = open('foobar.txt', 'w')
f.writelines(generate_macs('E8:06:88:00:00:00', 'E8:06:88:FF:FF:FF'))
f.close()
Die anderen Lösungen von Justin und Michael sind beide unendlich besser lesbar/wartbar angeboten laufen. Michaels benutzt 4MB oder Ram auf meinem Rechner. Justin verwendet 1 GB mit List Comprehension und nur 4 MB, wenn er durch einen Generator-Ausdruck ersetzt wird (wie er erwähnt hat). Mine 10MB verwenden und läuft etwa zweimal schnell, kostet der Client wahrscheinlich 10 mal so viel und wird in Zukunft weiter.
Die Metriken für die Leistung verwendeten Disk I/O in os/Activity Monitor und Mississippis von x.
EDIT: Neue Gewinner.
Schnellste Diese wirklich schreit und verwendet 4.1MB RAM. Generiert die Ausgabe in 2 Sekunden nach/dev/null.
def generate_macs():
from operator import add
from itertools import product
heads = [ 'E8:06:88:%02X:%01X' % i for i in product(xrange(0, 0x100), xrange(0, 0x10))]
tails = [ '%01X:%02X\n' % i for i in product(xrange(0, 0x10), xrange(0, 0x100))]
return starmap(add, product(heads, tails))
zweitschnellste fast so schnell wie die oben, wohl besser lesbar. 4,1 MB. Erzeugt Ausgabe nach/dev/null in 3 Sekunden
def generate_macs():
from itertools import product
hexs = [':%02X' % h for h in xrange(0, 0x100)]
return imap(''.join, product(('E8:06:88',), hexs, hexs, hexs, ('\n',)))
Fazit
- Meine letzten Lösungen haben keine Lookup-Tabellen und keine bitweise Operationen.
- Es gibt interessante Anwendungen für Produkt wie sie von den anderen Plakaten eingeführt.
- Jedes Mal, wenn Sie implizite Schleifen verwenden und Dinge auf c (wie ich es verstehe) tun können.
- Formatieren Sie weniger, oft.
Es stirbt konsequent an der gleichen Stelle? Benötigen Sie nur die einmal erstellte Liste? Was passiert, wenn Sie Ihre XRange nur auf 0x448650 bis 0x44865F ändern? Ist das der genaue Code, den Sie verwenden? – kevpie
Sie haben immer noch nicht gesagt, wofür Sie diese benötigen. Sie wissen, dass die volle Ausgabe in der Nähe von 300 MB sein wird, ja? –