hallo,
ik heb een eenvoudig stukje code in python, het werkt gewoon. maar ik vraag me af waarom dit zoveel geheugen ruimte kost 
ik zet een array met 230x een integer om naar een array met 230x8 = 1840 bits. dan zou je (met simpele gedachten) denken dat je 1840 bits verbruikt.
waar zit nou al die overhead in ?
eerst de code zodat hij te kopiëren is:
import time
from machine import Pin
import gc
bit_array = []
print("MEMORY", gc.mem_free())
Q1 = [0, 0, 3, 4, 255, 6, 7, 8, 9, 255, 11, 12, 13, 14, 1, 255, 1, 1, 1, 16, 16, 21, 255, 3, 255, 255, 255, 255,
255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 240, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 255, 255, 255, 255, 255, 255, 255, 255,
255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0]
print("MEMORY", gc.mem_free())
print("lengte v/d array met bytes =", len(Q1))
print("MEMORY", gc.mem_free())
for i in Q1:
for bit_pos in range(7,-1,-1):
if i & (1<<bit_pos) > 0:
bit_array.append(1)
else:
bit_array.append(0)
print("MEMORY", gc.mem_free())
print("lengte v/d array met bits =", len(bit_array))
en nu met wat text in paint:
Gebruik sys.getsizeof() voor het bepalen van een Python object size.
Zie: https://stackoverflow.com/questions/449560/how-do-i-determine-the-size…
bit_array is een array. Dus niet een array van bits, maar een gewone array net als elke andere array. Daar kun je van alles in zetten. Want python laat het toe om in elke index te zetten wat je wilt, een string, een integer, of een strukt. Dat betekent op zijn minst dat python administratie moet toevoegen aan elke entry om te weten wat er in zit. En dat kost geheugen.
En wat je daadwerkelijk wegschrijft zijn integers. Weliswaar alleen 0 of 1, maar het blijven integers. Python bepaal dan hoeveel ruimte daarvoor nodig is.
Het lijkt er nu op dat python 4 bytes opslaat voor elke entry.
Python kent geen ´bits´, maar wel ´bool´.
Dus je kunt proberen :
if i & (1<<bit_pos) > 0:
bit_array.append(True)
else:
bit_array.append(False)
Ander puntje is dat python niet weet hoe groot de array moet zijn. Dus die begint klein en moet steeds vergroot worden. Dat betekent -vaak- ook dat de array naar een ander adres moet verhuizen en gecopieerd moet worden. Dat zijn kostbare operaties (in termen van cpu cycles). Dus dan kan het goed zijn dat de compiler telkens de array size verdubbelt.
benleentje
Golden Member
OP welke arduino werk je nu. Als ik het zo even uitreken werk je met een 32bit cpu.
230 x 8 zou dan 230 bytes moeten zijn maar in een 32 bit cpu bestaan er geen bytes. Je kan ze er wel in maken maar dan word er eerst een 32 bit getal gelezen en daarin word dan naar de byte gekeken kost extra cpu tijd.
230 x 4 x 8 = 920.
en dat is er blijkbaar nog iets van overhead van 24 bytes = 6 dword (32bit) voor nodig.
Waarom er voor het programma zelf 8kB nodig is kan ik niet verklaren.
draait op een raspberry pi pico
if i & (1<<bit_pos) > 0: bit_array.append(True) else: bit_array.append(False)
dit verandert niks.
Hier is een voorbeeldje van een bitarray. Blijkbaar kan het wel met een library:
Persoonlijk zou ik alleen de oorspronkelijke array Q1 gebruiken, en dan een functie schrijven die een bit kan testen in dia array. Die tweede array kun je dan weglaten.
digithalys
RobH
Je mag in Python een variabele de naam 'bit_array' geven, maar daarmee is het nog geen array. In je code is bit_array een list door de '= []'.
Zo is ook Q1 een list en geen array. En met len(Q1) krijg je niet de hoeveelheid geheugen die Q1 inneemt maar het aantal elementen van de list.
Als alternatief zou je voor Q1 en bit_array 'bytearray' kunnen gebruiken.
bedankt, ik ben nu aan het kijken of ik het voorstel van dekees kan toepassen.
een functie schrijven die de juiste bit uit Q1 kan plukken en retouneren of deze "1" of "0" is.
benleentje
Golden Member
Ik heb toen zelf de volgende C functies arduino ide functies gebruikt
bitRead
bitSet
bitClear
Met bitRead kijk je dan of een bit 0 of 1 is
met biset kan je een bit op 1 zetten en met bitClear op 0
Voorbeeld van bitRead
if(bitRead(32bitArray[2], bitNr) {
jouw code
}Dacht dat het een C functie was maar het blijkt een arduino IDE functie te zijn.