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

Christian Theune ct at gocept.com
Di Okt 27 11:03:22 UTC 2009


Hi,

On 10/27/2009 11:55 AM, Sven Teresniak wrote:
> 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.

Ungenaues Zitat meinerseits.

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

Ja, hat etwas gedauert, siehe lesbarer Code. ;)

>> 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? :)

Ja, das ist deutlich angenehmer zu lesen als der erste Versuch. Als
Einzeiler-Loesung gefaellt mir die ziemlich gut.

"s" koennte man sich noch sparen. ;)

Netter kleiner Wettbewerb wenn man krank im Bett liegt. :)

Theuni

-- 
Christian Theune · ct at gocept.com
gocept gmbh & co. kg · forsterstraße 29 · 06112 halle (saale) · germany
http://gocept.com · tel +49 345 1229889 0 · fax +49 345 1229889 1
Zope and Plone consulting and development



Mehr Informationen über die Mailingliste Python-Leipzig