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 17:44 | IT novinky

    Digitální a informační agentura (DIA) na přelomu roku dokončila rozsáhlou modernizaci hardwarové infrastruktury základních registrů. Projekt za 236 milionů korun by měl zabránit výpadkům digitálních služeb státu, tak jako při loňských parlamentních volbách. Základní registry, tedy Registr práv a povinností (RPP), Informační systém základních registrů (ISZR) a Registr obyvatel (ROB), jsou jedním z pilířů veřejné správy. Denně

    … více »
    Ladislav Hagara | Komentářů: 3
    dnes 17:33 | IT novinky

    Evropská komise (EK) zahájila nové vyšetřování americké internetové platformy 𝕏 miliardáře Elona Muska, a to podle unijního nařízení o digitálních službách (DSA). Vyšetřování souvisí se skandálem, kdy chatbot s umělou inteligencí (AI) Grok na žádost uživatelů na síti 𝕏 generoval sexualizované fotografie žen a dětí. Komise o tom dnes informovala ve svém sdělení. Americký podnik je podezřelý, že řádně neposoudil a nezmírnil rizika spojená se zavedením své umělé inteligence na on-line platformě.

    Ladislav Hagara | Komentářů: 3
    dnes 15:11 | Komunita

    Bratislava OpenCamp pokračuje vo svojej tradícii a fanúšikovia otvorených technológií sa môžu tešiť na 4. ročník, ktorý sa uskutoční 25. 4. 2026 na FIIT STU v Bratislave. V súčasnosti prebieha prihlasovanie prednášok a workshopov – ak máte nápad, projekt, myšlienku, o ktoré sa chcete podeliť s komunitou, OpenCamp je správne miesto pre vás.

    Ladislav Hagara | Komentářů: 0
    dnes 13:33 | IT novinky

    Krádež není inovace (Stealing Isn't Innovation). Koalice umělců, spisovatelů a tvůrců protestuje proti používání autorsky chráněných děl velkými technologickými společnostmi pro trénování AI systémů bez povolení či kompenzace.

    Ladislav Hagara | Komentářů: 12
    dnes 12:22 | IT novinky

    Stát, potažmo ministerstvo vnitra plánuje zřízení nového, neveřejného virtuálního operátora, který by byl primárně určený na zajištěni kritické infrastruktury státu. Cílem je zajistit udržitelné, bezpečné, mobilní, vysokorychlostní datové a hlasové služby umožňující přístup ke kritickým aplikacím IZS a krizového řízení.

    karkar | Komentářů: 5
    dnes 01:44 | Nová verze

    Byla vydána nová verze 10.0 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze nové balíčky ownCloud Infinite Scale a Uptime-Kuma.

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

    Enkodér a dekodér SVT-AV1 (Scalable Video Technology for AV1) byl vydán v nové major verzi 4.0.0.

    Ladislav Hagara | Komentářů: 0
    včera 18:44 | Nová verze

    Byla vydána nová verze 3.0.8 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP je již k dispozici také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    24.1. 11:55 | Humor

    Microsoft poskytl FBI uživatelské šifrovací klíče svého nástroje BitLocker, nutné pro odemčení dat uložených na discích třech počítačů zabavených v rámci federálního vyšetřování. Tento krok je prvním známým případem, kdy Microsoft poskytl klíče BitLockeru orgánům činným v trestním řízení. BitLocker je nástroj pro šifrování celého disku, který je ve Windows defaultně zapnutý. Tato technologie by správně měla bránit komukoli kromě

    … více »
    NUKE GAZA! 🎆 | Komentářů: 34
    24.1. 01:44 | Komunita

    Spotify prostřednictvím svého FOSS fondu rozdělilo 70 000 eur mezi tři open source projekty: FFmpeg obdržel 30 000 eur, Mock Service Worker (MSW) obdržel 15 000 eur a Xiph.Org Foundation obdržela 25 000 eur.

    Ladislav Hagara | Komentářů: 4
    Které desktopové prostředí na Linuxu používáte?
     (18%)
     (6%)
     (0%)
     (10%)
     (22%)
     (3%)
     (5%)
     (2%)
     (11%)
     (33%)
    Celkem 634 hlasů
     Komentářů: 17, poslední 22.1. 15:24
    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: 1295×
    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: 37 | 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: 37 | 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: 37 | 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: 37 | 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: 37 | 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: 37 | 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: 37 | 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: 37 | 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: 37 | 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: 37 | 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: 37 | 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.