[Python-Leipzig] Hallo Liste; Fragen zu IP-Addressen (Parsing und random generation)

Sven Teresniak knorke at zehnvierzig.org
Di Okt 27 10:55:11 UTC 2009


On Tue, 27 Oct 2009 09:31:56 +0100
Christian Theune <ct at gocept.com> (Christian Theune) wrote:

> Hidiho,

> >>                 l=[`i` for i in l if i not in (0, 255)]      

> Dein Skript tut irgendwie noch nicht so ganz das Richtige (das x in (0,
> 255) verwirrt mich noch und die IPv4-Adressen werden in 2-Byte Laenge in
> Hex ausgegeben), daher kann ich das nicht zur Performance-Messung ranziehen.

Wo du in obiger Zeile ein x siehst, ist mir schleierhaft.
Lediglich IPV6-Adressen werden zur Basis 16 ausgegeben. Bei IPV4 nutzt man
gemeinhin dezimale Zahlen. Augen waschen!

Übrigens habe ich, wie du sicher gesehen hast (oder auch nicht), explizit 255
und 0 in den IPs ausgenommen, da diese idR eine eigene Bedeutung haben
(Stichwort Broadcast). Das war nicht gefordert, aber könnte für deine
Verwirrung gesorgt haben.

> Eine schnelle Variante (die ich fuer halbwegs elegant halte), sowie eine
> etwas langsamere (dafuer in meinem aesthetischen Empfinden deutlich
> bessere) sind im Anhang.

Die beiden Lösungen gefallen mir auch sehr gut.
Danke. Sehr pythonischer Code.

Allerdings generiere ich 1Mio IPV4 und IPV6 in 11s, während deine Lösung 21.5s
benötigt (i7 950, 3ghz, 2.6.30, Py2.6.2)

Das sind geschätzte 50% Unterschied.

Wenn ich auch 0 und 255 in den IPv4 zulasse (analog 0, 0xffff in IPv6), komme
ich auf 9.5s für mein Script. Ich denke mit etwas Microoptimierung könnte ich
das auch noch weiter beschleunigen.

Entfernt man diese Filterung, reduziert sich das ganze natürlich auf folgenden
eleganten (sic!) Code:


def randomIP6_2(urandom):
        s="%x:%x:%x:%x:%x:%x:%x:%x" % struct.unpack("H"*8, urandom.read(16))
        return s   

def randomIP4_2(urandom):                         
        s="%d.%d.%d.%d" % struct.unpack("BBBB", urandom.read(4))
        return s

Die Laufzeit liegt dann bei 8.5s, das ist ein Unterschied zu 21.5s, oder? :)

Und das mit einem Einzeiler... :)

Mit freundlichem Gruß
Sven Teresniak
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 198 bytes
Beschreibung: nicht verfügbar
URL         : <http://starship.python.net/pipermail/python-leipzig/attachments/20091027/28b23cb5/attachment.pgp>


Mehr Informationen über die Mailingliste Python-Leipzig