Sådan tælles tegn i Python


Bedste svar

Spørgsmålet er ret vagt. Tegn i Python er normalt indeholdt og behandles i strenge. Funktionen len () (indbygget) returnerer længden af ​​de fleste containere i Python (inklusive strenge). Så det er en slags “optælling.”

Hvis du f.eks. Vil tælle forekomster af hvert tegn for at generere histogramdata, kan du oprette en ordbog, kortlægge hvert tegn til dit antal og gentage over strengene eller teksten og opdaterer dine ordbogsværdier, mens du går. Eller du kan bare bruge en forekomst af klassen Tæller til samlinger -modulet i standarden biblioteker.

from collections import Counter

counts = Counter(somestring)

# counts now contains a dictionary like mapping of item counters

counts.update(morestuff)

# counts have been updated with new items and additional occurrences of previously

# seen item.

Forekomster af tællerklassen kan tælle alt, hvad der kan vurderes som en iterabel af hashable-objekter.

Hvis du mener at tælle tegn på en anden måde, i henhold til nogle andre kriterier bliver du nødt til at være meget mere specifik.

Svar

Nå, du kan bruge len () funktion, men jeg foreslår, at du går og forlader dette sprog så hurtigt, som du har indtastet det sådan:

> echo -n "hello world"|python -c "import os; os.system("wc -c")"

11

Haha, nah. Louis Parkes svarede godt. Men jeg kan fortælle dig, hvad der sker, hvis du ringer til Python:

11263> valgrind python -c "print(len("hello world"))" 2>&1|tail -n15

==31376== HEAP SUMMARY:

==31376== in use at exit: 417,246 bytes in 199 blocks

==31376== total heap usage: 3,324 allocs, 3,125 frees, 3,807,322 bytes allocated

==31376==

==31376== LEAK SUMMARY:

==31376== definitely lost: 0 bytes in 0 blocks

==31376== indirectly lost: 0 bytes in 0 blocks

==31376== possibly lost: 528 bytes in 1 blocks

==31376== still reachable: 416,718 bytes in 198 blocks

==31376== suppressed: 0 bytes in 0 blocks

==31376== Rerun with --leak-check=full to see details of leaked memory

==31376==

==31376== For counts of detected and suppressed errors, rerun with: -v

==31376== Use --track-origins=yes to see where uninitialised values come from

==31376== ERROR SUMMARY: 529 errors from 43 contexts (suppressed: 0 from 0)

Du spilder 3,8 mb RAM for bare at kalde det.

> valgrind lua5.2 -e "print(#"hello world")" 2>&1|tail -n15

==32388== Memcheck, a memory error detector

==32388== Copyright (C) 2002-2017, and GNU GPL"d, by Julian Seward et al.

==32388== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info

==32388== Command: lua5.2 -e print(#"hello\ world")

==32388==

11

==32388==

==32388== HEAP SUMMARY:

==32388== in use at exit: 0 bytes in 0 blocks

==32388== total heap usage: 305 allocs, 305 frees, 34,487 bytes allocated

==32388==

==32388== All heap blocks were freed -- no leaks are possible

==32388==

==32388== For counts of detected and suppressed errors, rerun with: -v

==32388== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

34 kb, det er en lille forskel for at gøre det samme. Faktor 100. Og dette bliver værre og værre, jo større dine projekter bliver. Og jeg nævnte ikke størrelsen på de delte biblioteker endnu, som er … enorme og mange som legion. Python gør mere eller mindre det samme som LuaJIT, men det er 30 gange langsommere. Jeg ville have brugt valgrind på LuaJIT, men der er en kendt valgrind-bug, der går ned på LuaJIT, så jeg tog 5.2. Men der er ikke meget forskel. Og jeg begynder ikke at uddybe de drastiske hukommelseslækager, der er officielle i Python og ikke om de hundreder af megabyte, der bliver indlæst som systembiblioteker til det, og som forbliver hjemmehørende i dit system.

Starttiderne er også meget langsommere med Python, jeg taler om en faktor på mere end 10 gange, som bliver smertefuld, hvis du har mange små scripts, der kører i dit operativsystem, som noget geni gjorde i Python, og det sænker opstartstiden efter faktor 10. Jeg er ikke imponeret over det, kan du forestille dig. Lær noget bedre, spild ikke dit talent på det, hvis du ikke bliver tvunget til at bruge det af din professor eller lærer.

Jeg siger ikke: lær Lua. Jeg mener, fungerer for mig, men jeg er ikke dig. Jeg siger bare, lær noget andet. Noget, virkelig. Bare ikke de hypede som Julia, Go, Haskell eller vade retro satanas Java. Stadig er alle bedre end Python. Der er kun et sprog værre end Python, og det ville være Ruby, hvilket kun er en smule værre end Malbolge. Hvis et sprog formår at være langsommere end Python, er der noget alvorligt galt ved det, og udviklerne lort på alt, hvad der endda langt fra ligner effektivitet. Den værste kodning nogensinde på det sprog, jeg har seriøst ingen idé om, hvordan de formåede at få deres ting så langsomme, måske låner de noget af computerkraften ud til en bitcoin-minearbejder i baggrunden? Jeg aner ikke.

Så tænk to gange.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *