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 19:55 | Zajímavý projekt

    Průkopnická firma FingerWorks kolem roku 2000 vyvinula vícedotykové trackpady s gesty a klávesnice jako TouchStream LP. V roce 2005 ji koupil Apple, výrobu těchto produktů ukončil a dotykové technologie využil při vývoji iPhone. Multiplatformní projekt Apple Magic TouchstreamLP nyní implementuje funkcionalitu TouchStream LP na současném Apple Magic Trackpad, resp. jejich dvojici. Diskuze k vydání probíhá na Redditu.

    |🇵🇸 | Komentářů: 0
    dnes 18:22 | Nová verze

    Byla vydána nová verze 10.3 sady aplikací pro SSH komunikaci OpenSSH. Přináší řadu bezpečnostních oprav, vylepšení funkcí a oprav chyb.

    Ladislav Hagara | Komentářů: 0
    dnes 15:11 | Zajímavý software

    Cloudflare představil open source redakční systém EmDash. Jedná se o moderní náhradu WordPressu, která řeší bezpečnost pluginů. Administrátorské rozhraní lze vyzkoušet na EmDash Playground.

    Ladislav Hagara | Komentářů: 1
    dnes 14:00 | Komunita

    Bratislava OpenCamp 2026 zverejnil program a spustil registráciu. Štvrtý ročník komunitnej konferencie o otvorených technológiách prinesie 19 prednášok na rôzne technologické témy. Konferencia sa uskutoční v sobotu 25. apríla 2026 v priestoroch FIIT STU v Bratislave.

    Ladislav Hagara | Komentářů: 0
    dnes 13:44 | Humor

    Na iVysílání lze zhlédnout všechny díly kultovního sci-fi seriálu Červený trpaslík.

    Ladislav Hagara | Komentářů: 5
    dnes 04:44 | IT novinky

    Společnost Valve aktualizovala přehled o hardwarovém a softwarovém vybavení uživatelů služby Steam. Podíl uživatelů Linuxu dosáhl v březnu 5,33 % (Windows -4,28 %, OSX +1,19 %, Linux +3,10 %). Nejčastěji používané linuxové distribuce jsou Arch Linux, Linux Mint a Ubuntu. Při výběru jenom Linuxu vede SteamOS Holo s 24,48 %. Procesor AMD používá 67,48 % hráčů na Linuxu.

    Ladislav Hagara | Komentářů: 3
    včera 23:22 | IT novinky

    Společnost Apple slaví padesáté narozeniny. Založena byla 1. dubna 1976.

    Ladislav Hagara | Komentářů: 1
    včera 22:33 | Nová verze

    FreeTube, desktopový klient pro YouTube využívající lokální API, byl vydán ve verzi 0.24.0. Toto velké opravné vydání implementuje SABR (Server-Based Adaptive Bit Rate), což řeší část nedávných problémů s načítáním videí z YouTube, a aktualizuje základní komponenty jako Electron nebo přehrávač Shaka Player.

    |🇵🇸 | Komentářů: 2
    včera 16:33 | Humor

    Je tu opět apríl. O víkendu zmizel kamion s 12 tunami tyčinek KitKat. Firmy to využívají k aprílovým žertům. Groupon má super akci. Koupíte 1 tyčinku a dostanete 100 zdarma. Ryanair si přelepil letadla. Šéf Outlooku se ptá, proč mají v baráku 14 beden tyčinek KitKat (𝕏). Prusa Research představuje Prusa Pro ACU a vysvětluje proč přílišné sušení škodí vaším filamentům. Telefon Sony Xperia má miliónnásobný zoom (𝕏). PC.net představil Super Ultrabox 2600 se zajímavými parametry. Další aprílové novinky například na April Fools' Day On The Web.

    Ladislav Hagara | Komentářů: 2
    včera 13:22 | IT novinky

    Společnost OpenAI, která stojí za chatovacím robotem s umělou inteligencí (AI) ChatGPT, získala od investorů 122 miliard USD (2,6 bilionu Kč). Hodnota společnosti tak dosáhla 852 miliard dolarů (více než 18 bilionů Kč). Nejnovější kolo investování se stalo největší, jaké zatím firma uskutečnila, a peníze mají posílit ambiciózní plány rozšíření výpočetní kapacity, datových center a nábor talentů.

    Ladislav Hagara | Komentářů: 16
    Které desktopové prostředí na Linuxu používáte?
     (15%)
     (7%)
     (1%)
     (12%)
     (30%)
     (3%)
     (5%)
     (1%)
     (14%)
     (23%)
    Celkem 1205 hlasů
     Komentářů: 29, poslední 31.3. 11:17
    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: 1304×
    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: 42 | 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: 42 | 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: 42 | 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: 42 | 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: 42 | 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: 42 | 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: 42 | 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: 42 | 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: 42 | 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: 42 | 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: 42 | 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.