TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Π—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ
Python Π—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ avatar

TGINSIGHT POST

Post #302

@pythonotes

Python Π—Π°ΠΌΠ΅Ρ‚ΠΊΠΈ

Views2,410Post view count
PostedDec 2012/20/2021, 09:01 AM
Post content

Post content

πŸ˜‹Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ° ΠΎΡ‚ читатСля@nencoru Как ΡΠΌΠ΅Ρ€ΠΆΠΈΡ‚ΡŒ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² с отсортированными строками Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ», Ρ‚ΠΎΠΆΠ΅ отсортированный? πŸ”Έ Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»: ▫️ Π² ΠΎΠ΄Π½ΠΎΠΉ строкС находится ΠΎΠ΄Π½Π° запись ▫️ запись содСрТит прСдсказуСмоС ΠΏΠΎΠ»Π΅ с Π½Π΅ΠΊΠΈΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для сортировки. НапримСр, Π»ΠΎΠ³ΠΈ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ▫️ всС записи Π² Ρ„Π°ΠΉΠ»Π΅ отсортированы ΠΏΠΎ этому полю πŸ”Έ Π—Π°Π΄Π°Ρ‡Π°: Π‘ΠΌΠ΅Ρ€ΠΆΠΈΡ‚ΡŒ нСсколько Ρ‚Π°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Ρ„ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ всС записи Π±Ρ‹Π»ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ отсортированы. πŸ”Έ РСшСниС 1: ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρƒ мСня JSON-Π»ΠΎΠ³ΠΈ files = ['file1.jsonl', 'file2.jsonl', ...] data = [] for file in files: with open(file) as f: data.expand( f.readlines() ) data.sort(key=lambda line: json.loads(line)['timestamp']) with open('merged.jsonl', 'w') as f: f.writelines(data) УслоТним Π·Π°Π΄Π°Ρ‡Ρƒ β€” Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° 5Gb😱 Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ потрСбуСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти 5*len(files) Gb. И ΡƒΠΆΠ΅ Π½Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ смоТСт ΡΠΌΠ΅Ρ€ΠΆΠΈΡ‚ΡŒ 3-4 Ρ‚Π°ΠΊΠΈΡ… Ρ„Π°ΠΉΠ»Π°. А Ссли ΠΈΡ… 100? fileinput ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ красивый ΠΊΠΎΠ΄, Π½ΠΎ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ Π½Π΅ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚. πŸ”Έ РСшСниС 2: МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ heapq.merge() ΠΈΠ· стандартного модуля heapq! Heap - это Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ элСмСнт Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСньшСС Ρ‡Π΅ΠΌ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ. Π’ΠΎ Π΅ΡΡ‚ΡŒ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ всС элСмСнты ΠΊΠ°ΠΊ-Π»ΠΈΠ±ΠΎ отсортированы. from heapq import merge items = [ [3,2,6], [1,5,4] ] print(list(merge(*items))) # [1, 2, 3, 4, 5, 6] А учитывая, Ρ‡Ρ‚ΠΎ merge это Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€, ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ Π΅ΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для сортировки, ΠΎΠ½ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ для нашСй Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ»Π½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Π½Π΅ происходит! И Ρ‚ΡƒΡ‚ Π²Ρ‹ спроситС: Ρ‡Ρ‚ΠΎ Π·Π° магия? Π’ΠΎΠΆΠ΅ самоС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π΅Π· расхода памяти? Π’ΠΎΠ»ΡˆΠ΅Π±Π½Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ всСх спасёт? НСт, Π·Π° всё приходится ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ. Π’ случаС с heapq вСсь процСсс драматичСски замСдлится. Но Π·Π°Π΄Π°Ρ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°! 😎 Π‘Π΄Π΅Π»Π°Π» для вас синтСтичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ€ΠΆΠ° ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Код ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ здСсь ↗️ ▫️make_logs() Π³Π΅Π½Π΅Ρ€ΠΈΡ‚ 30 Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ 50Mb для тСста ▫️merge_list() ΠΌΠ΅Ρ€ΠΆΠΈΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ Ρ‡Π΅Ρ€Π΅Π· простой список ▫️merge_heapq() ΠΌΠ΅Ρ€ΠΆΠΈΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ Ρ‡Π΅Ρ€Π΅Π· heapq ▫️memory_profiler считаСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ (Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ) ▫️ Ρ‚Π°ΠΊΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Ρ€ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠšΠΎΠΌΡƒ Π»Π΅Π½ΠΈΠ²ΠΎ Ρ‚Π°ΠΌ ΠΆΠ΅ смотритС ΠΌΠΎΠΈ тСсты: 1.5Gb ΠΈ 19.5с ΠΏΡ€ΠΎΡ‚ΠΈΠ² 19Mb ΠΈ 2ΠΌ 43с памяти Π² 80 Ρ€Π°Π· мСньшС, Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² 8 Ρ€Π°Π· большС ⚠️ Π’ΠΠ–ΠΠž для чистоты экспСримСнта Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ слСдуСт ΠΈΠ· консоли ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ тСсту Π½Π° процСсс. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΠ»ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ, запустили ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, Π·Π°ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, запустили Π²Ρ‚ΠΎΡ€ΠΎΠΉ. #bacik