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

    Webový prohlížeč Dillo (Wikipedie) byl vydán ve verzi 3.1.0. Po devíti letech od vydání předchozí verze 3.0.5. Doména dillo.org již nepatří vývojářům Dilla.

    Ladislav Hagara | Komentářů: 0
    včera 15:00 | Komunita

    O víkendu probíhá v Bostonu, a také virtuálně, konference LibrePlanet 2024 organizovaná nadací Free Software Foundation (FSF).

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

    Nová vývojová verze Wine 9.8 řeší mimo jiné chybu #3689 při instalaci Microsoft Office 97 nahlášenou v roce 2005.

    Ladislav Hagara | Komentářů: 0
    3.5. 13:11 | Nová verze

    Coppwr, tj. GUI nástroj pro nízkoúrovňové ovládání PipeWire, byl vydán v nové verzi 1.6.0. Zdrojové kódy jsou k dispozici na GitHubu. Instalovat lze také z Flathubu.

    Ladislav Hagara | Komentářů: 0
    2.5. 22:33 | Nová verze

    Byla vydána dubnová aktualizace aneb nová verze 1.89 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a animovanými gify v poznámkách k vydání. Vypíchnout lze, že v terminálu lze nově povolit vkládání kopírovaného textu stisknutím středního tlačítka myši. Ve verzi 1.89 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.

    Ladislav Hagara | Komentářů: 21
    2.5. 21:22 | Nová verze

    Proton, tj. fork Wine integrovaný v Steam Play a umožňující v Linuxu přímo ze Steamu hrát hry určené pouze pro Windows, byl vydán ve verzi 9.0-1 (𝕏). Přehled novinek se seznamem nově podporovaných her na GitHubu. Aktuální přehled her pro Windows běžících díky Protonu také na Linuxu na stránkách ProtonDB.

    Ladislav Hagara | Komentářů: 2
    2.5. 19:33 | Nová verze

    Byla vydána verze 1.78.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání na GitHubu. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    2.5. 11:22 | Bezpečnostní upozornění

    Služba Dropbox Sign (původně HelloSign) pro elektronické podepisování smluv byla hacknuta.

    Ladislav Hagara | Komentářů: 3
    2.5. 11:00 | Nová verze

    Byla vydána nová major verze 8.0 textového editoru GNU nano (Wikipedie). Podrobný přehled novinek a oprav v oznámení v diskusním listu info-nano nebo v souboru ChangeLog na Savannah. Volbou --modernbindings (-/) lze povolit "moderní" klávesové zkratky: ^C kopírování, ^V vložení, ^Z vrácení zpět, … Tato volba je aktivována také pokud binárka s nano nebo link na ni začíná písmenem "e".

    Ladislav Hagara | Komentářů: 4
    1.5. 23:22 | IT novinky

    Před 60 lety, 1. května 1964, byl představen programovací jazyk BASIC (Beginners' All-purpose Symbolic Instruction Code).

    Ladislav Hagara | Komentářů: 23
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (58%)
     (11%)
     (17%)
     (14%)
    Celkem 81 hlasů
     Komentářů: 8, poslední včera 08:25
    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: 1197×
    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;
    }
    
    Gréta avatar 25.9.2020 15:18 Gréta | skóre: 36 | 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
    Gréta avatar 25.9.2020 14:24 Gréta | skóre: 36 | 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'.
    Gréta avatar 25.9.2020 15:24 Gréta | skóre: 36 | 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).
    Gréta avatar 27.9.2020 15:55 Gréta | skóre: 36 | 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í.
    Gréta avatar 27.9.2020 16:04 Gréta | skóre: 36 | 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.
    Gréta avatar 27.9.2020 16:09 Gréta | skóre: 36 | 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

    Gréta avatar 8.2.2021 17:24 Gréta | skóre: 36 | 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
    Gréta avatar 9.2.2021 13:59 Gréta | skóre: 36 | 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.
    Gréta avatar 10.2.2021 00:12 Gréta | skóre: 36 | 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

    Gréta avatar 16.2.2021 21:16 Gréta | skóre: 36 | 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 :-(
    Gréta avatar 17.2.2021 17:01 Gréta | skóre: 36 | 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.