» Poradna » Programy

Extrémní listy v pythonu

 |   |  Microsoft Windows 10 Chrome 80.0.3987.132

Dobrý den, mám 2 listy x, který obsahuje 899157 čísel a y, který obsahuje 6001215 listů z nichž každý obsahuje 3 čísla. Potřebuji z y vytřídit pouze ty listy jejichž 1. člen je obsažen v listu x. Jaký je nejrychlejší způsob? Děkuji za odpověďPřiklad funkce:def main(): x = [1, 69, 55] y = [[1, 262, 656], [656321, 646, 5646]] z = list(filter(lambda a: (a[0] in x), y)) return zTento způsob by trval několik hodin, potřebuji rychlejší. Pokud by to nějak pomohlo, tak data jsou původně v csv a jsou převedena do listů.

Odpovědi na otázku

avatar
 | Microsoft Windows 10 Firefox 68.0

Pokud mas dost pameti, tak je preved na mnoziny (set) a pak udele prunik mnozin. Ale pri takhle velkych mnozstvich dat bych zvazil nejakou specializovanou knihovnu, treba numpy.Dalsi moznosti je pouzit alternativni interpretr, ktery umi zrychlit casto se opakujici operace - pypy.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Firefox 68.0

Aha - ted jsem docetl posledni radek (moje chyba) - pokud je to v CSV, z prvniho listu "x" udelej mnozinu a pri cteni CSV souboru "y" rovnou preskakuj radky, jejichz prvni clen pri cteni najdes v mnozine "x" (hledani prvku v mnozine je neporovnatelne rychlejsi nez hledani ve velkem seznamu/listu).

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 80.0.3987.132

Děkuji za odpověď, z x jsem udělal set a snažil jsem se implementovat porovnávání již u načítání, mám to dobře? Stále to není nějak extra rychlé, ale je to použitelnější.def get_items_lines(x): items = [] with open("filename.tbl") as file: for line in file: nr = line.index("|") if line[:nr] in x: parts = line[:-2].split("|") wanted_parts = (parts[0], parts[3], parts[14]) items.append(wanted_parts) return items

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Firefox 68.0

Je to lepsi, ale jeste lepsi by myslim bylo pouzit modul "csv" pro nacitani toho CSV souboru. Ten umoznuje nadefinovat si vlastni "reader", ktery by delal to co je potreba. Pokud jde ale o prosta cisla oddelana lomitkem, tak bych to udelal takto:http://dpaste.com/22A1P3ANevidel jsem ta data, takze netusim proc tam delas to [:-2] - to uz si musis upravit sam.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 80.0.3987.132

Nějak tak jsem to udělal a bylo to docela rychlé, takže už to mám, myslím že nejvíc pomohlo, předělání listu na set. Btw jako druhý argument u splitu nemohlo být 5, protože jsem potřeboval 14. část. Děkuji za rady.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Firefox 68.0

Pardon, spatne jsem precetl "14" jako "4". Cteni mi dnes moc nejde :/

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Firefox 74.0

V C++ bych si alokoval odpovídající velikost RAM např. 8 GB a všechna TXT data bych do ní načetl na jedno čtení (lze max. 2,5 GB). TXT data pak převést na integer čísla, vytvořit si na každé číslo klíč setříděním pomocí Merge Sort a pak binárním hledáním zjistit, zda se číslo z prvního listu nachází v listu se třemi čísli. Hledání odhaduji na pár sekund .

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Macintosh OS X AppleMAC-Safari 5.0

no mozna by bylo lepsi prevadet txt na integer rovnou pri nacitani, minimalne z duvodu uspory pameti. tim padem pri nacitani rovnou tridit obsah listu x podle velikosti a pripadne i obsah listu y podle hodnoty 1. clena (pri spravne implementaci bude rychlejsi nez trideni pri nacitani nez expost). Pak staci jednoducha funkce, ktera vyuzije vzrustajicich posloupnosti v listu x i y a pozadovany vysledek bude opravdu v radu sekund.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Macintosh OS X AppleMAC-Safari 5.0

sakra, opravuji:pri spravne implementaci bude rychlejsi trideni pri nacitani nez trideni expost

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Firefox 74.0

To určitě nebude. Píšu, nejdřív data načíst do RAM a to trvá cca 2,5 sekundy při načítaní dat z SSD (NVMe). Těžko při tom budeš ještě něco třídit, to počká, až budou data v paměti .

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Firefox 74.0

Jednodušší, ale pomalejší způsob je načíst data do tabulky Excelu (záložka "Data", "Načíst externí data") a vyfiltrovat ( power query) hledané data .

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Firefox 68.0

To jo, on je Excel pri par milionech radku primo skvely

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Firefox 74.0

Asi jsi nikdy nepracoval např. se 40 mil. dat. Excel to zvládne úplně v pohodě .

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Firefox 74.0

Tak to by mě zajímal postup na ten pohodový excel. Po načtení 1,5GB csv se excel rozbrečel

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Firefox 74.0

To samozřejmě neznamená, že se 40 mil. dat načte do Excel tabulky, pouze se s těmi daty pracuje externě. Power Query vyfiltruje potřebná data a ta se pak načtou do Excel tabulky.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Firefox 68.0

OK, beru. Power Query neznam. Kdykoli mam pracovat s vic nez nekolika sty radek, saham po necem jinem nez Excel. Kadopadne kazdemu co jeho jest.

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Nejrychlejší způsob, Člen


Určitě si přečtěte

Co přijde po Netflixu a Amazonu? Tohle jsou streamovací služby, na které v Česku čekáme

Co přijde po Netflixu a Amazonu? Tohle jsou streamovací služby, na které v Česku čekáme

** Rozhodujete se mezi Netflixem a HBO Go? Věřte, bude hůř ** Na trhu je mnohem víc ambicióznějších streamovacích služeb ** Některé by mohly do ČR zamířit ještě letos

Lukáš Václavík | 45

Za hranicemi Chromu: 13 nejzajímavějších prohlížečů, které „nikdo“ nepoužívá

Za hranicemi Chromu: 13 nejzajímavějších prohlížečů, které „nikdo“ nepoužívá

** Šesti nejpoužívanějším prohlížečům patří 94 % trhu ** Různé „klony“ Chromu slibují lepší funkce nebo jiný design ** Také Firefox má řadu zajímavých odnoží

Lukáš Václavík | 40

Jak uložit dokument z Wordu, aby vydržel celé roky? Je to těžší než cesta na Mars

Jak uložit dokument z Wordu, aby vydržel celé roky? Je to těžší než cesta na Mars

** Jak uložit soubory, aby vydržely vnoučatům? ** A co kdyby měly přečkat celá staletí? ** Teď se o to pokouší GitHub a je to oříšek i pro lingvisty

Jakub Čížek | 118

Z rozmazané šmouhy krásná fotka. Takhle kouzlí nová umělá inteligence MyHeritage

Z rozmazané šmouhy krásná fotka. Takhle kouzlí nová umělá inteligence MyHeritage

** MyHeritage slibuje nejlepší neuronovou síť pro vylepšování fotek ** Funguje tím líp, čím horší fotku upravuje ** Otestovali jsme desítky různých snímků

Marek Lutonský, Lukáš Václavík | 39


Aktuální číslo časopisu Computer

Megatest: nejlepší notebooky do 20 000 Kč

Test 8 levných IP kamer

Jak vybrat bezdrátová sluchátka

Testujeme Android 11