Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie Numba, um numerische Berechnungen in Python-Programmen zu beschleunigen

So verwenden Sie Numba, um numerische Berechnungen in Python-Programmen zu beschleunigen

PHPz
PHPzOriginal
2023-08-02 17:37:581437Durchsuche

So verwenden Sie Numba, um numerische Berechnungen von Python-Programmen zu beschleunigen

Einführung:
Python ist eine sehr flexible und einfach zu verwendende Sprache, wenn es um numerische Berechnungen geht. Da Python jedoch eine interpretierte Sprache ist, läuft es relativ langsam, insbesondere bei intensiven numerischen Rechenaufgaben. Um die Leistung von Python-Programmen zu verbessern, können wir einige Optimierungstools und Bibliotheken verwenden. Eine sehr leistungsstarke Bibliothek ist Numba, die die Just-in-Time-Kompilierung nutzt, um numerische Berechnungen zu beschleunigen, ohne die Struktur des Python-Codes zu ändern. In diesem Artikel wird erläutert, wie Sie Numba verwenden, um die numerische Berechnung von Python-Programmen zu beschleunigen.

  1. Numba installieren:
    Um Numba verwenden zu können, müssen Sie es zunächst installieren. Numba kann mit dem Pip-Paketmanager installiert werden:

    pip install numba
  2. Grundlegende Verwendung:
    Der einfachste Weg, Numba zu verwenden, besteht darin, es mit einem Dekorator auf die Funktion anzuwenden, die beschleunigt werden muss. Numba unterstützt zwei Hauptdekoratoren: @jit und @njit. Der @jit-Dekorator kann auf Funktionen angewendet werden und diese in Maschinencode kompilieren, um die Leistung zu verbessern. Der @njit-Dekorator ist eine Abkürzung für @jit(nopython=True), der eine Funktion in reinen Maschinencode umwandelt, ohne den Python-Interpreter zu verwenden. Hier ist ein einfaches Beispiel: @jit@njit@jit装饰器可以应用于函数,将其编译为机器码以提高性能。@njit装饰器是@jit(nopython=True)的一个快捷方式,它会将函数转换为不使用Python解释器的纯机器码。下面是一个简单的例子:

    from numba import jit
    
    @jit
    def sum_array(arr):
     total = 0
     for i in range(len(arr)):
         total += arr[i]
     return total
    
    arr = [1, 2, 3, 4, 5]
    result = sum_array(arr)
    print(result)

在上面的例子中,sum_array函数使用@jit装饰器进行了优化。Numba会自动推断函数中变量的类型,并将其编译为机器码。这样,函数的性能会得到大幅提升。

  1. 类型推断和类型注解:
    为了最大程度地提高性能,Numba需要确切地了解函数和变量的类型。在上面的例子中,Numba可以正确地推断出sum_array函数的类型。然而,在一些情况下,Numba可能无法自动推断类型,这时我们需要使用类型注解来帮助Numba准确地编译函数。下面是一个使用类型注解的例子:

    from numba import jit
    
    @jit('float64(float64[:])')
    def sum_array(arr):
     total = 0
     for i in range(len(arr)):
         total += arr[i]
     return total
    
    arr = [1.0, 2.0, 3.0, 4.0, 5.0]
    result = sum_array(arr)
    print(result)

在上面的例子中,我们通过@jit('float64(float64[:])')注解明确告诉Numbasum_array函数的输入和输出类型。这样,Numba可以更好地优化函数。

  1. 并行计算:
    Numba还支持并行计算,可以利用多核CPU提高计算性能。要使用并行计算,需要将@jit装饰器的并行参数设置为True

    from numba import njit
    
    @njit(parallel=True)
    def parallel_sum(arr):
     total = 0
     for i in range(len(arr)):
         total += arr[i]
     return total
    
    arr = [1, 2, 3, 4, 5]
    result = parallel_sum(arr)
    print(result)

在上面的例子中,parallel_sum函数通过将@njit(parallel=True)应用于函数上来实现并行计算。这样就可以同时利用多个CPU核心来加速计算。

  1. 使用Numba编译生成的代码:
    有时候我们可能想要查看Numba编译生成的机器码。可以通过inspect_llvminspect_asm函数来查看Numba生成的LLVM代码和汇编代码:

    from numba import jit, inspect_llvm, inspect_asm
    
    @jit
    def sum_array(arr):
     total = 0
     for i in range(len(arr)):
         total += arr[i]
     return total
    
    arr = [1, 2, 3, 4, 5]
    result = sum_array(arr)
    
    print(inspect_llvm(sum_array))  # 查看LLVM代码
    print(inspect_asm(sum_array))  # 查看汇编代码

在上面的例子中,我们使用inspect_llvminspect_asm函数来查看sum_arrayrrreee


Im obigen Beispiel wird die Funktion sum_array mithilfe des Dekorators @jit optimiert. Numba leitet automatisch die Variablentypen in Funktionen ab und kompiliert sie in Maschinencode. Auf diese Weise wird die Leistung der Funktion erheblich verbessert.

    Typinferenz und Typanmerkungen:
      Um die Leistung zu maximieren, muss Numba die Typen von Funktionen und Variablen genau kennen. Im obigen Beispiel kann Numba den Typ der Funktion sum_array korrekt ableiten. In einigen Fällen kann Numba den Typ jedoch möglicherweise nicht automatisch ableiten. In diesem Fall müssen wir Typanmerkungen verwenden, um Numba dabei zu helfen, die Funktion genau zu kompilieren. Hier ist ein Beispiel für die Verwendung von Typanmerkungen:
    1. rrreee
    2. Im obigen Beispiel teilen wir Numbasum_array explizit über die Annotation <code>@jit('float64(float64[:])') mit Die Eingabe- und Ausgabetypen der Funktion. Auf diese Weise kann Numba die Funktionen besser optimieren.
      Paralleles Computing: 🎜Numba unterstützt auch paralleles Computing, das Multi-Core-CPUs nutzen kann, um die Rechenleistung zu verbessern. Um paralleles Rechnen zu verwenden, müssen Sie den parallelen Parameter des @jit-Dekorators auf True setzen: 🎜rrreee🎜🎜🎜Im obigen Beispiel parallel_sum Code >Funktionen implementieren paralleles Rechnen, indem sie <code>@njit(parallel=True) auf die Funktion anwenden. Dadurch können mehrere CPU-Kerne gleichzeitig genutzt werden, um Berechnungen zu beschleunigen. 🎜
        🎜🎜Mit Numba-Kompilierung generierter Code: 🎜Manchmal möchten wir möglicherweise den durch Numba-Kompilierung generierten Maschinencode anzeigen. Der von Numba generierte LLVM-Code und Assembler-Code kann über die Funktionen inspect_llvm und inspect_asm angezeigt werden: 🎜rrreee🎜🎜🎜Im obigen Beispiel verwenden wir inspect_llvm und <code>inspect_asm-Funktionen, um den LLVM-Code und den Assembler-Code der Funktion sum_array anzuzeigen. 🎜🎜Fazit: 🎜Der Einsatz von Numba kann die numerische Rechenleistung von Python-Programmen deutlich verbessern. Durch einfaches Hinzufügen eines Dekorators zur Funktion, die beschleunigt werden muss, können wir die Just-in-Time-Kompilierungsfunktion von Numba nutzen, um Python-Code in effizienten Maschinencode zu kompilieren. Darüber hinaus unterstützt Numba auch Typinferenz, Typanmerkungen und paralleles Rechnen und bietet so weitere Optimierungsmöglichkeiten. Durch die Verwendung von Numba können wir die Einfachheit und Flexibilität von Python besser nutzen und gleichzeitig eine nahezu native Programmiersprachenleistung erzielen. 🎜🎜Referenzen: 🎜🎜🎜https://numba.pydata.org/🎜🎜https://numba.pydata.org/numba-doc/latest/user/jit.html🎜🎜https://numba.pydata . org/numba-doc/latest/user/examples.html🎜🎜

    Das obige ist der detaillierte Inhalt vonSo verwenden Sie Numba, um numerische Berechnungen in Python-Programmen zu beschleunigen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn