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

Christian Theune ct at gocept.com
Di Okt 27 08:31:56 UTC 2009


Hidiho,

On 10/27/2009 08:03 AM, Christian Theune wrote:
> On 10/26/2009 09:24 AM, Sven Teresniak wrote:
>> Hallo Volker
>>
>> On Sun, 25 Oct 2009 20:16:19 +0100
>> DVJ = "Dr. Volker Jaenisch" <volker.jaenisch at inqbus.de> wrote:
>>
>> DVJ>  Ad 2):
>> DVJ>  Bein generieren von IPs machte ich es mir bisher einfach, suche aber für die Produktion etwas
>> DVJ>  eleganteres und effizienteres.
>>
>> DVJ>  Wie kann man das besser machen?
>>
>> l=[]
>> urandom=open("/dev/urandom")
>>
>> def randomIP4_3(urandom):
>>         global l
>>         if len(l)<4:
>>                 l=struct.unpack("B"*4000, urandom.read(4000))
>>                 l=[`i` for i in l if i not in (0, 255)]      
> 
> Diese Zeile sieht nicht so aus als wenn sie tut was du willst.
> 
>>         s=".".join((l.pop(), l.pop(), l.pop(), l.pop()))
>>         return s
>>
>> def randomIP6_3(urandom):
>>         global l
>>         if len(l)<32:
>>                 l=struct.unpack("H"*4000, urandom.read(8000))
>>                 l=["%x" % i for i in l if i not in (0, 0xffff)]
> 
> Siehe oben.
> 
>>         s=":".join((l.pop(), l.pop(), l.pop(), l.pop(),l.pop(), l.pop(), l.pop(), l.pop()))
>>         return s
> 
> Hmm, da fallen mir ja dir Augen raus (was die Eleganz angeht). Ich guck
> mal wo die Performance eigentlich herkommt und ob das etwas eleganter
> auch noch schnell ist (was es IMHO sein sollte).

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.

Die Performance kommt von:

- Direktes auslesen von urandom (Byteweise ist ok, der 4000-Byte-Buffer
  ist nutzlos)
- Schnelles String-Ops (bei mir ist Interpolation deutlich schneller
  als join)
- struct vermeiden (ord und die bit-schieberei machen bei mir spuerbar
  was aus)
- und wie immer moeglichst wenig Overhead im tight loop.

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

Meine Kiste: Intel(R) Core(TM)2 Duo CPU     P9600  @ 2.66GHz auf 64-Bit
Linux 2.6.31 mit Python 2.6

Schnelle Variante:
real	0m22.003s
user	0m19.390s
sys	0m2.580s

Langsame Variante:
real	0m27.872s
user	0m25.410s
sys	0m2.460s

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
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : randomip.py
Dateityp    : text/x-python
Dateigröße  : 841 bytes
Beschreibung: nicht verfügbar
URL         : <http://starship.python.net/pipermail/python-leipzig/attachments/20091027/6bc7f0c1/attachment.py>


Mehr Informationen über die Mailingliste Python-Leipzig