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

"Göpfert, Jens" jens.goepfert at tracetronic.de
Di Okt 27 09:15:28 UTC 2009


Hallo,

ich habe mir das Problem mit der IP6-Generierung nun auch einmal angeschaut. Ich selbst ziehe Python auch jeder anderen Programmiersprache vor, aber wenn Performance großgeschrieben wird, dann greife ich doch wieder auf C zurück. Mit Pyrex kann man C-Code sehr einfach in Python einbinden. 
Ich habe einfach mal deinen Python Code für IP6 Generierung 1zu1 testweise in C umgesetzt und in Python eingebunden. Der C-teil ist noch nicht 100% korrekt (rand() erzeugt glaub ich max. 32767 und nicht 0xffff), aber zur Zeitmessung allemal geeignet. Ergebnis: Faktor 11 schneller ;-). 

Generierung von 1 Mio IP6-Adressen: (Intel Core2Duo T7500 at 2.2GHz)
- Python: 26.3 Sekunden
- mit C-Anbindung in Python: 2.2 Sekunden

Ich weiß nicht, ob es für dich eine Alternative darstellt. Beispiel mit Test anbei. (test.py im Verzeichnis deiner Plattform ausführen)

Gruß,
Jens

-------------------------------------------------------------------
Dipl.-Inf. Jens Göpfert

tracetronic GmbH
Heidelberger Str. 24
01189 Dresden
Telefon: +49 (0)351-20 57 68-29
Telefax: +49 (0)351-20 57 68-99
E-Mail: mailto:jens.goepfert at tracetronic.de
-------------------------------------------------------------------
Geschäftsführer: Dr.-Ing. Rocco Deutschmann, Dr.-Ing. Peter Strähle
Handelsregister: Amtsgericht Dresden, HRB 23 086
-------------------------------------------------------------------


-----Ursprüngliche Nachricht-----
Von: python-leipzig-bounces at python.net [mailto:python-leipzig-bounces at python.net] Im Auftrag von Christian Theune
Gesendet: Dienstag, 27. Oktober 2009 09:32
An: Python User Group Leipzig
Betreff: Re: [Python-Leipzig] Hallo Liste; Fragen zu IP-Addressen (Parsing und random generation)

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 
>> DVJ> aber für die Produktion etwas  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   : GenIp6.zip
Dateityp    : application/x-zip-compressed
Dateigröße  : 17887 bytes
Beschreibung: GenIp6.zip
URL         : <http://starship.python.net/pipermail/python-leipzig/attachments/20091027/89dac432/attachment-0001.bin>


Mehr Informationen über die Mailingliste Python-Leipzig