Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - (Roomba)-Plugin-Frage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Robert
    antwortet
    Zitat von JuMi2006 Beitrag anzeigen
    Für alle Werte (13 x unpack) benötige ich insgesamt 0.019874095916748047 Sekunden (mit time.time() gemessen).
    Ich glaube es sind eher 0.019874095916758047 Sekunden

    Noch mal: Mir ging es nicht um Zeit, sondern Lesbarkeit. Alleine die Extra-Funktion kostet Übersichtlichkeit. Dann kannst du doch auch überall direkt
    Code:
    value = unpack('>H', test[idx:idx+2]
    schreiben - wenn du in einem Jahr noch weißt, dass ">H" ein "unsigned short" ist!?

    Aber irgendwo findet da jeder Programmierer seinen Weg. :-)

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Für alle Werte (13 x unpack) benötige ich insgesamt 0.019874095916748047 Sekunden (mit time.time() gemessen).

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Hi Robert,

    weil wir schon so schön offtopic sind.

    timeit ist gut zum messen:

    Code:
    #!/usr/bin/env python3
    import timeit
    
    def vara():
        pass
    
    def varb():
        pass
    
    print(timeit.timeit(vara, number=10000))
    print(timeit.timeit(varb, number=10000))
    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Ich geb euch dann das Plugin, dann könnt Ihr das anpassen .

    In der Zeit bis ich den Kram verstanden habe, hab ich das dreimal getippt. Und beim Staubsauger ist mir das auch egal ob er nun 0.5 Sekunden delay hat .

    Wenn alles fertig ist sehe ich mir das sicherlich noch mal an, ob ich das aber 2 Monate noch/wieder verstehe wage ich zu bezweifeln.

    Ich bräuchte Ersatz für:

    Code:
    def DecodeUnsignedShort(self, low, high):
    def DecodeByte(self,byte):
    def DecodeShort(self, low, high):
    def DecodeUnsignedByte(self, byte):
    wobei ich das ehrlich nicht so schlimm finde, ich kann ja mal die Zeit messen die für die Werte drauf geht...aber nicht mehr heut.

    Grüße

    Einen Kommentar schreiben:


  • callidomus
    antwortet

    Einen Kommentar schreiben:


  • Robert
    antwortet
    Zitat von mknx Beitrag anzeigen
    Kleine Perfomance-Randnotitz:
    struct ist schneller, zumindest bei Py3.2. Habe ich mal für das KNX-Plugin gemessen.

    Bis bald

    Marcus
    Wenn wir jetzt über Zeit, und nicht über Les- und Wartbarkeit sinnieren: struct ist nur für Leute die zu viel Zeit haben:

    Code:
    root@server:~# python3 benchmark.py
    benchmark: struct with new bytes took: 5.41s
    benchmark: better struct took: 1.73s
    benchmark: best struct took: 1.27s
    benchmark: int took: 3.50s
    benchmark: direct took: 0.75s
    Code:
    #!/usr/bin/env python3
    # vim: set encoding=utf-8 tabstop=4 softtabstop=4 shiftwidth=4 expandtab
    
    import time
    from struct import *
    
    def DecodeUnsignedShort(low, high):
            bytearr = bytearray([high,low])
            value = unpack('>H', bytearr)
            #print (value[0])
            return (value[0])
    
    def DecodeUnsignedShort2(bytearr):
            value = unpack('>H', bytearr)
            #print (value[0])
            return (value[0])
    
    test = bytes(range(256))
    for power in range(12):
        test = test + test
    
    start = time.time()
    for idx in range(0,len(test),2):
        value = DecodeUnsignedShort(test[idx+1], test[idx])
        #print(value)
    print("benchmark: struct with new bytes took: {:.2f}s".format(time.time() - start))
    
    start = time.time()
    for idx in range(0,len(test),2):
        value = DecodeUnsignedShort2(test[idx:idx+2])
        #print(value)
    print("benchmark: better struct took: {:.2f}s".format(time.time() - start))
    
    start = time.time()
    for idx in range(0,len(test),2):
        value = unpack('>H', test[idx:idx+2])
        #print(value)
    print("benchmark: best struct took: {:.2f}s".format(time.time() - start))
    
    start = time.time()
    for idx in range(0,len(test),2):
        value = int.from_bytes(test[idx:idx+2], byteorder='little')
        #print(value)
    print("benchmark: int took: {:.2f}s".format(time.time() - start))
    
    start = time.time()
    for idx in range(0,len(test),2):
        value = test[idx] << 8 | test[idx+1];
        #print(value)
    print("benchmark: direct took: {:.2f}s".format(time.time() - start))

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    Kleine Perfomance-Randnotitz:
    struct ist schneller, zumindest bei Py3.2. Habe ich mal für das KNX-Plugin gemessen.

    Bis bald

    Marcus

    Einen Kommentar schreiben:


  • Robert
    antwortet
    Nö - da gibts du ihm einfach einen entsprechend größeren/kleineren Bereich!? Also x[4:9] für 32bit oder nur x[4] für 8bit. Und signed geht damit natürlich auch. Aber wenn du magst schreib halt mehr Code.

    Nebenbei: https://github.com/mknx/smarthome/co...bae26d1d69dc04 - da habe ich mein Plugin aus genau! demselben Grund umgestellt. Man beachte die Commit-Nachricht. Es gibt einfach keinen Sinn sich mit unleserlichen Code selbst ins Bein zu schießen wenn es FERTIGE Funktionen genau dafür gibt...

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Hallo Robert,

    nein aber ich brauch noch mehrere Datentypen, da ist es einfacher das Schema was ich als Vorlage nutze weiter zu verarbeiten, sonst geht die Fragerei bei unsigned long, unsigned byte etc. weiter .

    Einen Kommentar schreiben:


  • Robert
    antwortet
    Zitat von JuMi2006 Beitrag anzeigen
    O.K. ich habs jetzt

    Code:
        _capacity = self.DecodeUnsignedShort(answer[25],answer[24]) #capacity
    
        def DecodeUnsignedShort(self, low, high):
            bytearr = bytearray([high,low])
            value = unpack('>H', bytearr)
            print (value[0])
            return (value[0])
    So passt das ganz gut. Bis ich darauf kam dass unpack ein bytearray haben will hats aber auch gedauert.
    Ist dir
    Code:
    _capacity = int.from_bytes(answer[24:26], byteorder='little')
    zu einfach?

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    O.K. ich habs jetzt

    Code:
        _capacity = self.DecodeUnsignedShort(answer[25],answer[24]) #capacity
    
        def DecodeUnsignedShort(self, low, high):
            bytearr = bytearray([high,low])
            value = unpack('>H', bytearr)
            print (value[0])
            return (value[0])
    So passt das ganz gut. Bis ich darauf kam dass unpack ein bytearray haben will hats aber auch gedauert.

    Einen Kommentar schreiben:


  • Robert
    antwortet
    Lass die eigene Funktion weg und benutze einfach int.from_bytes(x[4:7], byteorder='little') oder Ähnliches. Und dann ggfl. Skalieren. 4. Built-in Types ? Python v3.3.2 documentation

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Ich mach heute auch Schluss, freue mich natürlich weiter über sachdienliche Hinweise bei "Aktenzeichen Bits&Bytes ungelöst".

    Einen Kommentar schreiben:


  • callidomus
    antwortet
    (Roomba)-Plugin-Frage

    Int 0-255

    Morgen kann ich dir weiter helfen.

    Gute Nacht

    Marcus

    Einen Kommentar schreiben:


  • JuMi2006
    antwortet
    Hallo Marcus,

    danke für die Hilfe, den Fehler hatte ich mir gerade wieder selbst eingebaut.
    Welches Format müssten denn low und high in diesem Fall haben? Vielleicht hilft mir das schon weiter.
    Bei Bits und Bytes ist mein Abstraktionsgrad einfach am Ende. Ich arbeite zwar täglich mit Künstlern unterschiedlichster Genre aber die sind im Gegensatz zur IT wirklich bodenständig .

    Ich will doch nix weiter als aus 10 und 109 einen Integer zwischen 0 – 65535, eigentlich sollte Python anhand dieser Randbedingungen arbeiten können ... also wenn ich mir was wünschen dürfte

    Kurzweg: Passt auch nicht.

    Einen Kommentar schreiben:

Lädt...
X