Hoe karakters te tellen in Python


Beste antwoord

De vraag is nogal vaag. Tekens, in Python, worden normaal gesproken opgenomen en verwerkt in strings. De len () functie (ingebouwd) retourneert de lengte van de meeste containers in Python (inclusief strings). Dat is dus een soort van “telling”.

Als u de exemplaren van elk teken afzonderlijk wilt tellen, bijvoorbeeld om histogramgegevens te genereren, dan kunt u een woordenboek samenstellen, waarbij u elk teken aan uw aantal koppelt, itererend over de tekenreeksen of tekst en het bijwerken van uw woordenboekwaarden terwijl u bezig bent. Of u kunt gewoon een instantie van de Counter -klasse gebruiken voor de Collections -module in de standaard bibliotheken.

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.

Instanties van de Counter-klasse kunnen alles tellen dat kan worden geëvalueerd als een iterabele van hash-objecten.

Als je bedoelt tekens op een andere manier te tellen, volgens een aantal andere criteria, zul je veel specifieker moeten zijn.

Antwoord

Nou, je kunt de len () functie, maar ik stel voor dat je die taal zo snel verlaat als je hem als volgt hebt ingevoerd:

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

11

Haha, nee. Louis Parkes gaf een goed antwoord. Maar ik kan je vertellen wat er gebeurt als je Python aanroept:

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)

Je gaat 3,8 mb RAM verspillen door het gewoon aan te roepen.

> 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, dat is een klein verschil als je hetzelfde doet. Factor 100. En dit wordt erger en erger naarmate uw projecten groter worden. En ik heb de omvang van de gedeelde bibliotheken nog niet genoemd, die zijn … enorm en legio. Python doet min of meer hetzelfde als LuaJIT, maar het is 30 keer langzamer. Ik zou valgrind op LuaJIT hebben gebruikt, maar er is een bekende valgrind-bug die crasht op LuaJIT, dus nam ik 5.2. Maar er is niet veel verschil. En ik ga niet uitweiden over de drastische geheugenlekken die officieel zijn in Python en niet over de honderden megabytes die daarvoor als systeembibliotheken worden geladen en die in je systeem blijven.

De opstarttijden zijn ook veel langzamer met Python, ik heb het over een factor van meer dan 10 keer, wat pijnlijk wordt als je veel kleine scripts in je OS draait die een genie deed in Python en die langzamer gaan de opstarttijd met factor 10. Daar ben ik niet van onder de indruk, kun je je voorstellen. Leer iets beters, verspil je talent daar niet aan als je niet gedwongen wordt het te gebruiken door je professor of leraar.

Ik zeg niet: leer Lua. Ik bedoel werkt voor mij, maar ik ben jou niet. Ik zeg gewoon, leer iets anders. Alles eigenlijk. Alleen niet de gehypte zoals Julia, Go, Haskell of vade retro satanas Java. Toch zijn ze allemaal beter dan Python. Er is maar één taal die erger is dan Python en dat zou Ruby zijn, die slechts een beetje erger is dan Malbolge. Als een taal langzamer werkt dan Python, is er iets ernstig mis mee en de ontwikkelaars schijten op alles dat zelfs van ver naar efficiëntie riekt. Slechtste codering ooit in die taal, ik heb serieus geen idee hoe ze hun spullen zo langzaam hebben weten te krijgen, misschien lenen ze een deel van de rekenkracht aan een bitcoin-mijnwerker op de achtergrond? Ik heb geen idee.

Denk dus twee keer na.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *