abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 03:44 | Nová verze

    Bitwig Studio (Wikipedie) bylo vydáno ve verzi 6. Jedná se o proprietární multiplatformní (macOS, Windows, Linux) digitální pracovní stanici pro práci s audiem (DAW).

    Ladislav Hagara | Komentářů: 0
    dnes 02:11 | Komunita

    Společnost Igalia představila novou linuxovou distribuci (framework) s názvem Moonforge. Jedná se o distribuci určenou pro vestavěné systémy. Vychází z projektů Yocto a OpenEmbedded.

    Ladislav Hagara | Komentářů: 0
    dnes 00:44 | Nová verze

    Google Chrome 146 byl prohlášen za stabilní. Nejnovější stabilní verze 146.0.7680.71 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 29 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    dnes 00:22 | Nová verze

    D7VK byl vydán ve verzi 1.5. Jedná se o fork DXVK implementující překlad volání Direct3D 3 (novinka), 5, 6 a 7 na Vulkan. DXVK zvládá Direct3D 8, 9, 10 a 11.

    Ladislav Hagara | Komentářů: 0
    včera 23:22 | Nová verze

    Bylo vydáno Eclipse IDE 2026-03 aneb Eclipse 4.39. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.

    Ladislav Hagara | Komentářů: 2
    včera 10:22 | Upozornění

    Ze systému Slavia pojišťovny uniklo přibližně 150 gigabajtů citlivých dat. Jedná se například o pojistné dokumenty, lékařské záznamy nebo přímou komunikaci s klienty. Za únik může chyba dodavatelské společnosti.

    Ladislav Hagara | Komentářů: 9
    včera 10:11 | IT novinky

    Sněmovna propustila do dalšího kola projednávání vládní návrh zákona o digitální ekonomice, který má přinést bezpečnější on-line prostředí. Reaguje na evropské nařízení DSA o digitálních službách a upravuje třeba pravidla pro on-line tržiště nebo sociální sítě a má i víc chránit děti.

    Ladislav Hagara | Komentářů: 25
    včera 09:33 | IT novinky

    Meta převezme sociální síť pro umělou inteligenci (AI) Moltbook. Tvůrci Moltbooku – Matt Schlicht a Ben Parr – se díky dohodě stanou součástí Meta Superintelligence Labs (MSL). Meta MSL založila s cílem sjednotit své aktivity na poli AI a vyvinout takovou umělou inteligenci, která překoná lidské schopnosti v mnoha oblastech. Fungovat by měla ne jako centralizovaný nástroj, ale jako osobní asistent pro každého uživatele.

    Ladislav Hagara | Komentářů: 0
    včera 00:22 | Nová verze

    Byla vydána betaverze Fedora Linuxu 44 (ChangeSet), tj. poslední zastávka před vydáním finální verze, která je naplánována na úterý 14. dubna.

    Ladislav Hagara | Komentářů: 1
    10.3. 12:11 | IT novinky

    Open source router Turris Omnia NG Wired je v prodeji. Jedná se o Turris Omnia NG bez Wi-Fi. Je připraven pro zamontování do racku.

    Ladislav Hagara | Komentářů: 6
    Které desktopové prostředí na Linuxu používáte?
     (16%)
     (6%)
     (0%)
     (11%)
     (29%)
     (2%)
     (5%)
     (2%)
     (13%)
     (25%)
    Celkem 1054 hlasů
     Komentářů: 26, poslední dnes 08:56
    Rozcestník

    Dotaz: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    25.9.2020 11:13 Zm
    Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Přečteno: 1301×
    Ahoj, chci číst binární soubor po dvou bajtech a u každé z 65536 kombinací zaznamenat počet výskytů. Na konci programu vypsat, která z kombinací se vyskytuje méně než nějaká hranice (např. 100x).

    V C bych si udělal uint64_t pole[65536] a po načtení 2B inkrementoval hodnotu. Jak to udělat v Python 3 aby to bylo správně pythonistické?

    Řešení dotazu:


    Odpovědi

    25.9.2020 13:59 Zm
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    V C to mám napsané takto
    #include string.h>
    #include stdio.h>
    
    #define COMB_COUNT 65536
    
    int main(void)
    {
      const char *filename = "file.bin";
    
      unsigned long long int treshold = 5;
      unsigned long long int bin_arr[COMB_COUNT];
      unsigned twob;
      unsigned int i;
      FILE *fd;
    
      if (!(fd = fopen(filename, "rb"))) {
        return -1;
      }
    
      memset(bin_arr, '\0', COMB_COUNT);
      while ((i = fread(&twob, 2, 1, fd)) > 0) {
        bin_arr[twob] += 1;
      }
    
      for (i = 0; i < COMB_COUNT; i++) {
        if (bin_arr[i] < treshold) {
          printf("%04x, %llu times\n", i, bin_arr[i]);
        }
      }
    
      fclose(fd);
    
      return 0;
    }
    
    NUKE GAZA! 🎆 avatar 25.9.2020 15:18 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    muj pokus o co nejpodobnější přepsání do pythonu :O :D :D ;D

    #!/usr/bin/env python3
    
    POCET_KOMBINACI = 65536
    TRESHOLD = 100
    
    try:
        fd = open('soubor.bin', 'rb')
    except IOError:
        print('nejde otevrit soubor binarni jeden :O :\'(') # :D :D
        exit(-1)
    
    with fd:
        # uděláme si list vo velikosti počtu kombinací
        bin_arr = [0] * POCET_KOMBINACI
        
        # zkusíme přečíst dva byty
        byty = fd.read(2)
        
        # dokud máme dva byty přečtený
        while len(byty) == 2:
        
            # převedem na index v tom našem listu 'bin_arr'
            # v metodě from_bites musíme říct jakej to je endian jakože jestli big nebo little
            index = int.from_bytes(byty, 'little') 
            bin_arr[index] += 1
            
            # načtem dvojici bytů pro další iteraci
            byty = fd.read(2)
            
        # zavřem soubor
        fd.close()
            
        # vypišem ty věčí hodnoty než treshold
        for i in range(POCET_KOMBINACI):
            if bin_arr[i] > TRESHOLD:
                print(f'{i.to_bytes(2, "little")}, {bin_arr[i]} times')
                
        # v pythonu mužem je asi obyklejší iterovat foreachem
        # takže by to asi jako lepší bylo
        # for hodnota in bin_arr:
        #    if hodnota > TRESHOLD:
        #        ....
                
        exit(0) # zbytečný volat nakonec skriptu v pythonu si myslim ale nevim jistě :O :O
    
    25.9.2020 22:08 MadCatX | skóre: 28 | blog: dev_urandom
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    import sys
    import struct
    
    log = {}
    with open(sys.argv[1], 'rb') as fh:
        raw = fh.read(2)
        while raw is not None and len(raw) == 2:
            word = struct.unpack('<H', raw)[0]
            if word in log:
                log[word] += 1
            else:
                log[word] = 1
            raw = fh.read(2)
    
    for k in sorted(log.keys()):
        v = log[k]
        if v < 100:
            print('[{}]: {}'.format(k, v))
    
    Jendа avatar 26.9.2020 00:19 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
            if word in log:
                log[word] += 1
            else:
                log[word] = 1
    log = defaultdict(int)
    Jendа avatar 26.9.2020 00:11 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    1) int pole[100] = {0}; // immediate inicializace

    2)
    c.c: In function ‘main’:
    c.c:20:3: warning: ‘memset’ used with length equal to number of elements without multiplication by element size [-Wmemset-elt-size]
       20 |   memset(bin_arr, '\0', COMB_COUNT);
          |   ^~~~~~
    
    Doporučuju používat nějaký hustý kompilátor (třeba rozumně nové gcc) se zapnutými všemi warningy (tohle bylo -Wall -Wextra -Wduplicated-cond -Wduplicated-branches -Wlogical-op -Wrestrict -Wnull-dereference -Wjump-misses-init -Wdouble-promotion -Wshadow -Wformat=2).
    26.9.2020 21:10 Zm
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Nebo tam dát

    memset(bin_arr, '\0', sizeof(bin_arr));
    26.9.2020 20:56 z_sk | skóre: 34 | blog: analyzy
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Lepsie by bolo, keby twob bol typ uint16_t, vid..
    debian.plus@protonmail.com
    NUKE GAZA! 🎆 avatar 25.9.2020 14:24 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    atak já ti to teda zkusim napsat ale jako fakt nevim jestli je to jakože bude fakt správnej pythonistickej zápis :O ;D

    # nóó začala bych jakoby tak že bych si udělala slovník kterej bude mit
    # jako keys/klíče ty jednotlivý kombinace bytů a jako values/hodnoty
    # počty nalezenejch výskytů 
    
    # takže uděláme slovník
    slovnik = {}
    
    # a do něj nastrkáme ty klíče pro všecky ty konbinace dvojic bytů
    for i in range(256):
        for j in range(256):
            
            # do slovníku přidáme novej klíč a hodnotu normálně jako slovnik[klic]=hodnota
            # tamto bytes([nejakej_int]) předělá int na bytes
            # noa byty mužemenormálně strkat zasebe tim plusem
            
            # tady ta podmínka if i > j je tady proto abysme ždycky ten věčí byte strčili 
            # nazačátek tý naší kombinace protože 'ab' je pronás to samý co 'ba'
            # neni pro todleto náhodou nějakej víc lepšejší matematickej způsob????? :O :O
            if i > j:
                slovnik[ bytes([i]) + bytes([j])] = 0
            else:
                slovnik[ bytes([j]) + bytes([i])] = 0
    
            # poznámka:
            # nóó jak si jako teďko líp čtu tu tvou votázku :D tak jestli todleto nepotřebuješ a chceš jakože fakt kombinace jenom po sobě jdoucích bytů
            # tak ty ify dej do pryč a v ckylu postupuj jenom po jednom bytu a pamatuj si ten zminulý iterace a znich si dělej ty kombinace :O ;D
    
    # čteme soubor binárně
    with open('soubor.bin', 'rb') as f:
        
        # přečtem dvojici bytů takle
        prvni_byte = f.read(1)
        druhy_byte = f.read(1)
        # pokud byte neni read vrátí b''
        
        # TODO ošetřit situaci kdy máš lichej počet bytů :O :O :O :O
        # b'' se vyhodnotí jako false všecko vostatní true
        # nóó takže dokavaď máme dva byty
        while prvni_byte and druhy_byte:
            
            # kouknem jestli je první věčí než druhej jestli ne tak prohodíme
            # znova pokavaď todleto nepotřebuješ dej do pryč
            if druhy_byte > prvni_byte:
                tmp = prvni_byte
                prvni_byte = druhy_byte
                druhy_byte = tmp
              
            #sestavíme tu kombinaci
            kombinace = prvni_byte + druhy_byte
            # a inkrementujem hodnotu ve slovníku
            slovnik[ kombinace ] += 1
            
            # načteme byty pro další iteraci
            prvni_byte = f.read(1)
            druhy_byte = f.read(1)
            
            
    # pro vokrasu seřadíme podle počtu výskytů těch kombinací
    serazeno = sorted(slovnik.items(), key=lambda x: x[1])
    
    # a vypišem všecky kde je víc jak těch tvejch 100 kombinací :O ;D
    for klic, hodnota in serazeno:
        if hodnota > 100:
            print(f"kombinace: {klic} pocet: {hodnota}")
    
    print('hotovo!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!')
    
    25.9.2020 14:54 Zm
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Díky!

    Trochu jsem doufal, že to bude v Pythonu efektivnější ve smysl počtu řádku, ale je to cca 20 C a 24 py, byť to py navíc seřadí.

    Ale moc se mi nezdá to prohazování bajtů podle velikosti. Pokud to beru tak, že mám všechny kombinace 16 bitů a chci vědět kolikrát je která zastoupená, tak pro mě 'ab' není to samý co 'ba'.
    NUKE GAZA! 🎆 avatar 25.9.2020 15:24 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    nóó když neni tak neni :D ;D btw v komentu v poznámce pišu jestli to jako nechceš tak abys jakoby umazal ty ify a prohazování ;D

    pokusila sem se ještě přepsat ten tvuj cčkovej zdrojáček do pythonu tak koukni jestli to je jakoby to co ty chceš :O ;D

    25.9.2020 21:55 Zm
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Napadlo mě jestli spíš nemám řešit endianitu. Ale vzhledem k tomu, že se to změnou endianu přesune jen na jiné místo v tom poli, je to asi zbytečné.

    Každopádně velké dík za pomoc.
    25.9.2020 22:44 Bherzet | skóre: 19 | blog: Bherzetův blog
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Ale vzhledem k tomu, že se to změnou endianu přesune jen na jiné místo v tom poli, je to asi zbytečné.
    Ano, ke kolizím docházet nebude, ale vypíše to jiný výsledek (word 0xaabb na vstupu to bude prezentovat jako 0xbbaa na výstupu).
    NUKE GAZA! 🎆 avatar 27.9.2020 15:55 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    podobně jako v madcataxovým zdrojáčku de tady taky nahradit ten slovnik={} a jeho 'alokace' tim jendovým defaultdictem slovnik=defaultdict(int)

    Jendа avatar 26.9.2020 00:24 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Tak schválně jak si ta řešení stojí z hlediska výkonu. Hledáš věci, které se vyskytují alespoň 100x, takže to asi nebude úplně malé. Osobně tipuju, že zde uvedené Pythoní řešení budou 100x pomalejší než naivní C, a že použitím nedávno zde probíraného fread_unlocked to C zrychlím ještě 2x.

    Tak schválně.

    Pro tento účel jsem pořídil 19MB náhodný soubor, kde se vyskytovala jedna kombinace 98x, jinak všechny víckrát.

    Naivní C s ASANem: 0.25s

    Naivní C -O3: 0.21s

    Naivní C -O3 unlocked: 0.17s

    Gréta 1 (otočil jsem jí nerovnost): 2.9s

    MadCatX: 4.4s

    MadCatX s defaultdict: 4s

    Závěr: není to tak špatné jak jsem si myslel, ale furt je to pomalejší cca. 20x.

    Osobně bych to dal jako modul a natáhl ho přes CFFI. Chci o tom napsat blogpost.
    26.9.2020 16:01 MadCatX
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    mmapované C vs Python:

    C:
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <assert.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdint.h>
    #include <string.h>
    
    #define NUM_WORDS 65536
    #define RESULTS_SIZE (sizeof(uint_fast64_t) * NUM_WORDS)
    
    int main(int argc, char **argv)
    {
            int fd;
            void *data;
            size_t data_length;
            unsigned short *pos;
            unsigned short *end;
            uint_fast64_t *results;
    
            if (argc < 1)
                    return EXIT_FAILURE;
    
            results = malloc(RESULTS_SIZE);
            if (results == NULL)
                    return EXIT_FAILURE;
    
            memset(results, 0, RESULTS_SIZE);
    
            fd = open(argv[1], O_RDONLY);
            if (fd < 0)
                    return EXIT_FAILURE;
    
            data_length = lseek(fd, 0, SEEK_END);
            data_length -= data_length % 2;
            data = mmap(NULL, data_length, PROT_READ, MAP_PRIVATE, fd, 0);
            if (data == MAP_FAILED)
                    return EXIT_FAILURE;
    
            pos = (unsigned short *)data;
            end = (unsigned short *)(data + data_length);
            for (; pos < end; pos++)
                    results[*pos]++;
    
            for (size_t idx = 0; idx < NUM_WORDS; idx++) {
                    uint_fast64_t value = results[idx];
                    if (value < 1500)
                            printf("[%zu]: %lu\n", idx, value);
            }
    
            return EXIT_SUCCESS;
    }
    
    Totéž v Pythonu:
    import mmap
    import struct
    import sys
    
    
    log = [0] * 65536
    with open(sys.argv[1], 'rb') as fh:
        fh.seek(0, 2)
        data_length = fh.tell()
        data_length -= data_length % 2
        data = mmap.mmap(fh.fileno(), data_length, mmap.MAP_PRIVATE, mmap.PROT_READ)
    
        unpack_word = struct.Struct('<H').unpack_from
        idx = 0
        while idx < data_length:
            word = unpack_word(data, idx)[0]
            log[word] += 1
            idx += 2
    
    for k,v in enumerate(log):
        v = log[k]
        if v < 200:
            print('[{}]: {}'.format(k, v))
    
    Časy pro 20, resp. 200 MB soubory z /dev/urandom:

    C: 0,22; 0,35 s

    Python: 4,8; 49,0 s

    U Cčka je dost znát ten fixní overhead, zatímco Python visí v té čtecí smyčce. No co, aspoň je vidět, že na různé problémy je vhodné vzít si vždy správný šroubovák.
    Jendа avatar 26.9.2020 16:31 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Tohle je ještě 3x rychlejší než to tvoje:
    import numpy as np
    
    a = np.fromfile("r", dtype=np.uint16)
    bins = np.arange(0, 65535+1, 1)
    hist, _ = np.histogram(a, bins)
    
    ma_data = np.ma.masked_greater(hist, 100)
    
    print(ma_data.compressed())
    
    26.9.2020 18:00 MadCatX
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Hustý, něco takového jsem hledal, když jsem vymýšlel, jak na to napasovat Numbu.
    import sys
    import numba
    import numpy
    
    
    @numba.jit(nopython=True)
    def walk(buf):
        log = [0] * 65536
        for v in buf:
            log[v] += 1
        return log
    
    
    with open(sys.argv[1], 'rb') as fh:
        data = numpy.fromfile(fh, numpy.uint16)
        log = walk(data)
    
    for k, v in enumerate(log):
        v = log[k]
        if v < 150:
            print('[{}]: {}'.format(k, v))
    
    Dává do docela zajímavé výsledky:

    20 MB, práh 150:
    NumPy: 1,15 s
    NumPy+Numba: 1,00 s

    200 MB, práh 1500:
    NumPy: 10,2 s
    NumPy+Numba: 1,25 s

    Aneb nejrychlejší způsob, jak zrychlit Python je zbavit se co nejvíce nativně pythoního kódu :)
    4.10.2020 16:15 Jindřich Makovička | skóre: 17
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Případně jestli rádi Pandas...
    #!/usr/bin/python3
    
    import numpy as np
    import pandas as pd
    
    pd.set_option("display.max_rows", None)
    
    dt = np.dtype([('value', 'u2')])
    data = np.fromfile('data.bin', dtype=dt)
    df = pd.DataFrame(data)
    
    df2 = df.groupby(by='value')['value'].count()
    
    print(df2[df2 < 10])
    
    26.9.2020 21:16 Bherzet | skóre: 19 | blog: Bherzetův blog
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    mmap v Pythonu jsem zkoušel včera a vyšlo mi to na cca 150MB soubor skoro 2× pomalejší než prostý read po bajtech.
    26.9.2020 21:18 Zm
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Ten binární soubor má okolo 100 MB.
    Jendа avatar 26.9.2020 22:43 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    A vadí když to poběží 20 sekund? (ty moje testy byly na notebooku s i5 8. generace, takže poměrně moderní, ale notebook)

    Nechal bych to v C a přilepil přes CFFI.
    26.9.2020 23:09 Zm
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Pouštím to ručně, takže bych těch 20s přežil. Ale čekat do 1s v C je příjemnější.
    26.9.2020 23:31 MadCatX
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    I v pythonu se dostaneš k časům okolo 1 s, když ty nejprotěžovanější cykly necháš JITnout Numbou. Zrovna pro tvůj případ se to zdá jako šikovné řešení.
    NUKE GAZA! 🎆 avatar 27.9.2020 16:04 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    nóó jestli to jako neni děsně tajný proč to jakoby potřebuješ mit napsaný v tom pythonu misto v cčku?? :O :O

    28.9.2020 00:32 Zm
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Není na tom nic tajného. Pomocné prográmky si raději dělám v Pythonu, protože se v něm většínou udělají snadněji (tento případ je, zdá se, výjimka potvrzující pravidlo), nemusí se kompilovat, jsou blbuvzdornější (viz. to pomotané memset) a taky proto abych se Py. trochu naučil.
    NUKE GAZA! 🎆 avatar 27.9.2020 16:09 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    nóóóó ještě de udělat hulvátřešení jakože zkompilovat si cčkovej kód do binárky atu pouštět z pythonu a výstup si v pouštěcím skriptu parsovat :O ;D čistý ani pythonistický řešení to asi jako neni ale funguje to :D ;D tamto cffi asi jako bude vo něco rychleší si myslim

    NUKE GAZA! 🎆 avatar 8.2.2021 17:24 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    27.9.2020 09:56 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    import sys
    if len(sys.argv) != 2:
      print('Hovno, vole.', file=sys.stderr)
      sys.exit(3)
    pairs = {}
    with open(sys.argv[1], 'rb') as fuck:
      while shit := fuck.read(2):
        if len(shit) == 1:
          print('Zasraný soubor.', file=sys.stderr)
          sys.exit(5)
        pairs.setdefault(shit, [0])[0] += 1
    counts = {}
    for pair, count in pairs.items():
      counts.setdefault(count[0], []).append(pair)
    for key in sorted(counts.keys(), reverse=True):
      for b in sorted(counts[key]):
        print(f'{key}: [{b[0]:02x}, {b[1]:02x}]')
    
    9.2.2021 00:16 BFU
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Kdyz ono to v shellu jde jako oneliner :-)

    $ xxd -c2 -ps file | sort | uniq -c | sort
    NUKE GAZA! 🎆 avatar 9.2.2021 13:59 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    ti tam jakoby eště chybí ten threshold ;D

    9.2.2021 23:05 BFU
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    No tak zrovna pro min nez 100 vyskytu treba grep "^ \+[0-9][0-9]\? ", ackoli by me zajimalo, jestli je neco lepsiho nez to drtit regexama.
    NUKE GAZA! 🎆 avatar 10.2.2021 00:12 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    možná jakoby ňák rozpůlit výstupy toho posledního sortu mezerou/bílejma znakama a první půlky předělat na int a koukat jestli sou věčí než treshold a pak to vypysovat ale toby jako byl mocmocmoc vošlivej oneliner :O :D :D ;D

    15.2.2021 11:39 Charon
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    Jo, tak ten hexdump je dost dobrý trik!!! To mne inspirovalo k úpravám v jiných skriptech, kde to "řeším" přes gawk. Takže moc díky za tip. Na oplátku dodám "improvement" navrhovaného one-lineru.

    xxd -c2 -ps file | LANG=C sort --parallel=8 | uniq -c | sort -k 2 -k 1

    Pro můj testovací 50MB file to na mém MacBook běží v parallel verzi cca 37sekund. Původně mě to běželo 3 minuty, což mě nepřijde jako "promptní" one-liner. :-) A proto ta motivace k inovaci na rychlost a úsporu času. Může být zajímavé v sort použít přepínač -S 8G, kdy si příkaz sort alokuje více RAM paměti na obcování s daty při jejich třídění.

    Řešení, jak vypsat výskyty menší než trashold? (např. méně než 100), nechám dalším ke studiu. Byť ten návrh s grep mě přijde OK.

    Bye. Charon

    NUKE GAZA! 🎆 avatar 16.2.2021 21:16 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    ešení, jak vypsat výskyty menší než trashold? (např. méně než 100), nechám dalším ke studiu. Byť ten n

    xxd -c2 -ps file | LANG=C sort --parallel=8 | uniq -c | sort -k 2 -k 1 | awk -v thr="100" '$1 > thr'
    
    Jendа avatar 17.2.2021 01:00 Jendа | skóre: 78 | blog: Jenda | JO70FB
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?
    Může být zajímavé v sort použít přepínač -S 8G
    A přitom ta úloha má zjevné lineární řešení s konstantní pamětí a sort třídí v nlogn čase a lineárně paměti :-(
    NUKE GAZA! 🎆 avatar 17.2.2021 17:01 NUKE GAZA! 🎆 | skóre: 41 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
    Rozbalit Rozbalit vše Re: Jak zjistit počet výskytů 16b kombinací v Python3 ?

    nj ale když uděláš něco takovýho

    xxd -c2 -ps file | awk '{a[$0]++}END{for(i in a){if(a[i]>100)print a[i], i}}' | sort

    tak už to jakoby neni žádnej oneliner hezkej :/ :/

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.