{"id":2577,"date":"2025-09-18T00:37:09","date_gmt":"2025-09-17T22:37:09","guid":{"rendered":"https:\/\/davidka.net\/en\/?p=2577"},"modified":"2025-09-21T03:21:00","modified_gmt":"2025-09-21T01:21:00","slug":"array-array-in-python-when-and-why-to","status":"publish","type":"post","link":"https:\/\/de.davidka.net\/de\/2025\/09\/18\/array-array-in-python-when-and-why-to\/","title":{"rendered":"\ud83e\uddd1\u200d\ud83d\udcbb array.array in Python verwenden: Wann und warum"},"content":{"rendered":"\n<p class=\"has-neve-link-color-color has-text-color has-link-color has-medium-font-size wp-elements-38d8c435b9df6525bdefead4bba5697a wp-block-paragraph\">Das Modul <strong><code class=\"\" data-line=\"\">array<\/code><\/strong> stellt einen spezialisierten Datentyp <code class=\"\" data-line=\"\">array.array<\/code> zur Speicherung von Sequenzen homogener Zahlen bereit. Im Gegensatz zur universellen <code class=\"\" data-line=\"\">list<\/code> bieten <code class=\"\" data-line=\"\">array.array<\/code>-Arrays eine effizientere Speichernutzung und eine h\u00f6here Leistung bei der Arbeit mit numerischen Daten.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce6 Hauptvorteile von <code class=\"\" data-line=\"\">array.array<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der Hauptunterschied zwischen <code class=\"\" data-line=\"\">array.array<\/code> und <code class=\"\" data-line=\"\">list<\/code> ist die <strong>kompakte Datenspeicherung<\/strong>. Anstelle einer Liste von Zeigern auf Python-Objekte speichert <code class=\"\" data-line=\"\">array.array<\/code> Werte als zusammenh\u00e4ngenden Block von Bytes, was es ideal f\u00fcr die folgenden Aufgaben macht.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. Speichereinsparungen bei der Arbeit mit gro\u00dfen Zahlens\u00e4tzen<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Bei der Verarbeitung von Millionen numerischer Elemente werden Speichereinsparungen entscheidend. <code class=\"\" data-line=\"\">array.array<\/code> reduziert den Overhead erheblich.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">import array\nimport sys\n\ndef compare_memory_usage(num_elements: int = 1_000_000) -&gt; None:\n    &quot;&quot;&quot;\n    Vergleicht die Speichernutzung zwischen list und array.array.\n\n    Args:\n        num_elements (int, optional): Anzahl der Elemente f\u00fcr den Test. \n                                      Standardm\u00e4\u00dfig 1.000.000.\n    &quot;&quot;&quot;\n    # Erstellen einer Liste mit ganzzahligen Python-Objekten\n    list_numbers = list(range(num_elements))\n\n    # Erstellen eines Arrays, in dem Zahlen als 4-Byte-C-Typ-Ints gespeichert werden\n    array_numbers = array.array(&#039;i&#039;, range(num_elements))\n\n    list_size = sys.getsizeof(list_numbers)\n    array_size = sys.getsizeof(array_numbers)\n\n    print(f&quot;Anzahl der Elemente: {num_elements}&quot;)\n    print(f&quot;Gr\u00f6\u00dfe der Liste:  {list_size \/ 1024 \/ 1024:.2f} MB&quot;)\n    print(f&quot;Gr\u00f6\u00dfe des Arrays: {array_size \/ 1024 \/ 1024:.2f} MB&quot;)\n    if array_size &gt; 0:\n        print(f&quot;Speichereinsparung: {list_size \/ array_size:.2f}x&quot;)\n\n# Beispiel f\u00fcr die Verwendung\nif __name__ == &quot;__main__&quot;:\n    compare_memory_usage()<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Ausgabe:<\/strong>&#8222;`<br>Anzahl der Elemente: 1000000<br>Gr\u00f6\u00dfe der Liste: 7.63 MB<br>Gr\u00f6\u00dfe des Arrays: 3.82 MB<br>Speichereinsparung: 2.00x<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">---\n\n### 2. Gesteigerte Leistung bei numerischen Operationen\n\nAufgrund der zusammenh\u00e4ngenden Speicherzuweisung werden mathematische Operationen mit `array.array`-Elementen schneller ausgef\u00fchrt, da der Prozessor den Cache effizienter nutzen kann.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">python<br>import array<br>import timeit<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def compare_performance(num_elements: int = 10_000_000) -> None:<br>&#8222;&#8220;&#8220;<br>Vergleicht die Leistung beim Summieren von Elementen in list und array.array.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">Args:\n    num_elements (int, optional): Anzahl der Elemente f\u00fcr den Test. \n                                  Standardm\u00e4\u00dfig 10.000.000.\n&quot;&quot;&quot;\nsetup_code = f&quot;&quot;&quot;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">import array<br>data = range({num_elements})<br>list_data = list(data)<br>array_data = array.array(&#8218;i&#8216;, data)<br>&#8222;&#8220;&#8220;<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Zeit f\u00fcr die Liste messen\nlist_time = timeit.timeit(&quot;sum(list_data)&quot;, setup=setup_code, number=10)\n\n# Zeit f\u00fcr das Array messen\narray_time = timeit.timeit(&quot;sum(array_data)&quot;, setup=setup_code, number=10)\n\nprint(f&quot;Zeit zum Summieren von {num_elements} Elementen (10 Mal):&quot;)\nprint(f&quot;list:  {list_time:.4f} Sekunden&quot;)\nprint(f&quot;array: {array_time:.4f} Sekunden&quot;)<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Beispiel f\u00fcr die Verwendung<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">if <strong>name<\/strong> == &#8222;<strong>main<\/strong>&#8222;:<br>compare_performance()<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">**Ausgabe:**<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zeit zum Summieren von 10000000 Elementen (10 Mal):<br>list: 2.1106 Sekunden<br>array: 1.1549 Sekunden<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">---\n\n### 3. Direkte Arbeit mit C-Bibliotheken (`ctypes`, `struct`)\n\n`array.array` ist ideal f\u00fcr die \u00dcbergabe von Daten an Low-Level-Bibliotheken, die in C geschrieben sind, da seine interne Struktur mit C-Arrays kompatibel ist.\n\n#### Beispiel mit `ctypes`:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">python<br>import array<br>from ctypes import c_double, CDLL<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def demonstrate_ctypes_usage() -> None:<br>&#8222;&#8220;&#8220;<br>Demonstriert die \u00dcbergabe von array.array an eine C-Funktion \u00fcber ctypes.<br>&#8222;&#8220;&#8220;<br># Array mit Double-Precision-Zahlen (Typ &#8218;d&#8216;)<br>py_array = array.array(&#8218;d&#8216;, [1.1, 2.2, 3.3, 4.4])<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Erstellen eines C-kompatiblen Arrays aus py_array\n# Die Funktion (c_double * len(py_array)) erstellt einen Typ &quot;Array von 4 c_double&quot;\n# (*py_array) entpackt das Python-Array in die Argumente dieses Konstruktors\nc_array = (c_double * len(py_array))(*py_array)\n\n# Hier k\u00f6nnte ein Aufruf an eine C-Funktion stehen, zum Beispiel:\n# my_c_library = CDLL(&quot;.\/libmath.so&quot;)\n# my_c_library.sum_doubles(c_array, len(c_array))\n\nprint(f&quot;Python-Array: {py_array}&quot;)\nprint(f&quot;C-kompatibles Array (ctypes): {&#091;val for val in c_array]}&quot;)<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Beispiel f\u00fcr die Verwendung<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">if <strong>name<\/strong> == &#8222;<strong>main<\/strong>&#8222;:<br>demonstrate_ctypes_usage()<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">#### Beispiel mit `struct` zur Datenpaketierung:<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">python<br>import array<br>import struct<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def demonstrate_struct_packing(data: list[int]) -> bytes:<br>&#8222;&#8220;&#8220;<br>Packt ein Array von Ganzzahlen in einen bin\u00e4ren String.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">Args:\n    data (list&#091;int]): Liste der zu packenden Ganzzahlen.\n\nReturns:\n    bytes: Bin\u00e4re Darstellung der Daten.\n&quot;&quot;&quot;\narr = array.array(&#039;i&#039;, data)\n\n# Erstellen eines Format-Strings wie &#039;3i&#039; f\u00fcr 3 Ganzzahlen\nformat_string = f&#039;{len(arr)}i&#039;\n\n# Daten in bin\u00e4res Format packen\nbinary_data = struct.pack(format_string, *arr)\n\nprint(f&quot;Urspr\u00fcngliches Array: {arr}&quot;)\nprint(f&quot;Bin\u00e4re Daten: {binary_data}&quot;)\n\n# \u00dcberpr\u00fcfung: wieder entpacken\nunpacked_data = struct.unpack(format_string, binary_data)\nprint(f&quot;Entpackte Daten: {unpacked_data}&quot;)\n\nreturn binary_data<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Beispiel f\u00fcr die Verwendung<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">if <strong>name<\/strong> == &#8222;<strong>main<\/strong>&#8222;:<br>demonstrate_struct_packing([10, 20, 30])<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">---\n\n### 4. Effiziente Serialisierung und Deserialisierung\n\nDie Methoden `.tobytes()` und `.frombytes()` erm\u00f6glichen die schnelle Umwandlung eines Arrays in Bytes und zur\u00fcck, was ideal zum Speichern in Dateien oder zur \u00dcbertragung \u00fcber ein Netzwerk ist.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">python<br>import array<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def handle_binary_data() -> None:<br>&#8222;&#8220;&#8220;<br>Demonstriert die Serialisierung und Deserialisierung von array.array in Bytes.<br>&#8222;&#8220;&#8220;<br># Urspr\u00fcngliches Array erstellen<br>source_array = array.array(&#8218;i&#8216;, [1, 2, 3, 4, 5])<br>print(f&#8220;Urspr\u00fcngliches Array: {source_array}&#8220;)<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\"># Array in Bytes serialisieren\nbinary_data = source_array.tobytes()\nprint(f&quot;Daten in Bytes: {binary_data}&quot;)\n\n# Aus Bytes in ein neues Array deserialisieren\nnew_array = array.array(&#039;i&#039;)\nnew_array.frombytes(binary_data)\nprint(f&quot;Wiederhergestelltes Array: {new_array}&quot;)\n\n# Integrit\u00e4t pr\u00fcfen\nassert source_array == new_array, &quot;Daten stimmen nicht \u00fcberein!&quot;\nprint(&quot;Datenintegrit\u00e4t best\u00e4tigt.&quot;)<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Beispiel f\u00fcr die Verwendung<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">if <strong>name<\/strong> == &#8222;<strong>main<\/strong>&#8222;:<br>handle_binary_data()<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">---\n\n### 5. Garantie der Typ-Homogenit\u00e4t\n\n`array.array` erzwingt strikt nur einen Datentyp, der bei der Erstellung angegeben wird. Dies verhindert das versehentliche Hinzuf\u00fcgen von Elementen eines anderen Typs.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">python<br>import array<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def demonstrate_type_safety() -> None:<br>&#8222;&#8220;&#8220;<br>Zeigt, dass array.array das Hinzuf\u00fcgen von Elementen eines anderen Typs nicht erlaubt.<br>&#8222;&#8220;&#8220;<br>arr = array.array(&#8218;i&#8216;, [100, 200, 300])<br>print(f&#8220;Ganzzahl-Array: {arr}&#8220;)<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">try:\n    # Versuch, ein String-Element hinzuzuf\u00fcgen\n    arr.append(&#039;hello&#039;)\nexcept TypeError as e:\n    # Erwartete Ausnahme\n    print(f&quot;\\nDer Versuch, &#039;hello&#039; hinzuzuf\u00fcgen, hat einen Fehler ausgel\u00f6st: {e}&quot;)\n    print(&quot;Dies best\u00e4tigt die strikte Typisierung des Arrays.&quot;)<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Beispiel f\u00fcr die Verwendung<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">if <strong>name<\/strong> == &#8222;<strong>main<\/strong>&#8222;:<br>demonstrate_type_safety()<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">---\n\n### 6. Direktes Schreiben und Lesen aus Bin\u00e4rdateien\n\nDie Methoden `.tofile()` und `.fromfile()` vereinfachen die Arbeit mit Bin\u00e4rdateien und vermeiden eine zwischengeschaltete Serialisierung.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">python<br>import array<br>from pathlib import Path<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">def work_with_binary_files(file_path_str: str = &#8222;data.bin&#8220;) -> None:<br>&#8222;&#8220;&#8220;<br>Schreibt ein Array in eine Bin\u00e4rdatei und liest es wieder ein.<\/p>\n\n\n\n<pre class=\"wp-block-code line-numbers\"><code class=\" language-python\" data-line=\"\">Args:\n    file_path_str (str, optional): Dateiname zum Speichern.\n                                   Standardm\u00e4\u00dfig &quot;data.bin&quot;.\n&quot;&quot;&quot;\nfile_path = Path(file_path_str)\nsource_array = array.array(&#039;f&#039;, &#091;1.5, 2.7, 3.14])\n\ntry:\n    # In Datei schreiben\n    with file_path.open(&#039;wb&#039;) as f:\n        source_array.tofile(f)\n    print(f&quot;Array {source_array} wurde in die Datei &#039;{file_path}&#039; geschrieben.&quot;)\n\n    # Aus Datei lesen\n    new_array = array.array(&#039;f&#039;)\n    with file_path.open(&#039;rb&#039;) as f:\n        # 3 Elemente vom Typ &#039;f&#039; (float) lesen\n        new_array.fromfile(f, len(source_array))\n    print(f&quot;Array {new_array} wurde aus der Datei gelesen.&quot;)\n\n    assert source_array == new_array\n\nfinally:\n    # Garantiertes L\u00f6schen der Datei nach der Ausf\u00fchrung\n    if file_path.exists():\n        file_path.unlink()\n        print(f&quot;Tempor\u00e4re Datei &#039;{file_path}&#039; wurde gel\u00f6scht.&quot;)<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">Beispiel f\u00fcr die Verwendung<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">if <strong>name<\/strong> == &#8222;<strong>main<\/strong>&#8222;:<br>work_with_binary_files()<br>&#8222;`<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd39 Vergleichstabelle: <code class=\"\" data-line=\"\">array.array<\/code> vs. <code class=\"\" data-line=\"\">list<\/code><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Merkmal<\/th><th class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">array.array<\/code><\/th><th class=\"has-text-align-left\" data-align=\"left\"><code class=\"\" data-line=\"\">list<\/code><\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Datentyp<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Homogene Primitive (Zahlen, Zeichen)<\/td><td class=\"has-text-align-left\" data-align=\"left\">Beliebige Python-Objekte<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Speicher<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Geringer Verbrauch<\/td><td class=\"has-text-align-left\" data-align=\"left\">Hoher Verbrauch<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Leistung<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Hoch bei numerischen Operationen<\/td><td class=\"has-text-align-left\" data-align=\"left\">Geringer bei numerischen Operationen<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>API<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Begrenzter Satz von Methoden<\/td><td class=\"has-text-align-left\" data-align=\"left\">Reichhaltige und flexible API<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>C-Kompatibilit\u00e4t<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Hoch, direkte Daten\u00fcbertragung<\/td><td class=\"has-text-align-left\" data-align=\"left\">Konvertierungen erforderlich<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Bin\u00e4re Serialisierung<\/strong><\/td><td class=\"has-text-align-left\" data-align=\"left\">Integrierte Methoden (<code class=\"\" data-line=\"\">.tobytes<\/code>, <code class=\"\" data-line=\"\">.tofile<\/code>)<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erfordert <code class=\"\" data-line=\"\">struct<\/code>, <code class=\"\" data-line=\"\">pickle<\/code> usw.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Fazit:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud83d\ude80 Verwenden Sie <code class=\"\" data-line=\"\">array.array<\/code>, wenn Sie mit gro\u00dfen Mengen <strong>homogener numerischer Daten<\/strong> arbeiten und wenn <strong>Leistung<\/strong> und <strong>effiziente Speichernutzung<\/strong> f\u00fcr Sie entscheidend sind.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die meisten allt\u00e4glichen Aufgaben, bei denen Flexibilit\u00e4t und die Speicherung heterogener Daten erforderlich sind, bleibt <code class=\"\" data-line=\"\">list<\/code> die beste Wahl.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Modul array stellt einen spezialisierten Datentyp array.array zur Speicherung von Sequenzen homogener Zahlen bereit. Im Gegensatz zur universellen list bieten array.array-Arrays eine effizientere Speichernutzung und eine h\u00f6here Leistung bei der Arbeit mit numerischen Daten.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"left","neve_meta_author_avatar":"on","neve_post_elements_order":"[\"content\",\"tags\",\"comments\"]","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-2577","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/2577","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/comments?post=2577"}],"version-history":[{"count":0,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/posts\/2577\/revisions"}],"wp:attachment":[{"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/media?parent=2577"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/categories?post=2577"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/de.davidka.net\/de\/wp-json\/wp\/v2\/tags?post=2577"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}