Nachdem wir ein Beispiel für die Leistung eines Spielzeugs durchgespielt haben, schweifen wir nun etwas ab und vergleichen die Leistung mit
ein paar Python-Implementierungen. Zuerst richten wir die Bühne für die Berechnungen ein und stellen die Befehlszeile
bereit.
Funktionen des Python-Skripts.
import argparse import time import math import numpy as np import os from numba import njit from joblib import Parallel, delayed parser = argparse.ArgumentParser() parser.add_argument("--workers", type=int, default=8) parser.add_argument("--arraysize", type=int, default=100_000_000) args = parser.parse_args() # Set the number of threads to 1 for different libraries print("=" * 80) print( f"\nStarting the benchmark for {args.arraysize} elements " f"using {args.workers} threads/workers\n" ) # Generate the data structures for the benchmark array0 = [np.random.rand() for _ in range(args.arraysize)] array1 = array0.copy() array2 = array0.copy() array_in_np = np.array(array1) array_in_np_copy = array_in_np.copy()
Und hier sind unsere Teilnehmer:
for i in range(len(array0)): array0[i] = math.cos(math.sin(math.sqrt(array0[i])))
np.sqrt(array_in_np, out=array_in_np) np.sin(array_in_np, out=array_in_np) np.cos(array_in_np, out=array_in_np)
def compute_inplace_with_joblib(chunk): return np.cos(np.sin(np.sqrt(chunk))) #parallel function for joblib chunks = np.array_split(array1, args.workers) # Split the array into chunks numresults = Parallel(n_jobs=args.workers)( delayed(compute_inplace_with_joblib)(chunk) for chunk in chunks )# Process each chunk in a separate thread array1 = np.concatenate(numresults) # Concatenate the results
@njit def compute_inplace_with_numba(array): np.sqrt(array,array) np.sin(array,array) np.cos(array,array) ## njit will compile this function to machine code compute_inplace_with_numba(array_in_np_copy)
Und hier sind die Timing-Ergebnisse:
In place in ( base Python): 11.42 seconds In place in (Python Joblib): 4.59 seconds In place in ( Python Numba): 2.62 seconds In place in ( Python Numpy): 0.92 seconds
Die Numba ist überraschend langsamer!? Könnte es an dem Mehraufwand der Kompilierung liegen, wie mohawk2 in einem IRC-Austausch zu diesem Problem betonte?
Um dies zu testen, sollten wir einmal „compute_inplace_with_numba“ aufrufen, bevor wir den Benchmark ausführen. Dies zeigt, dass Numba jetzt schneller als Numpy ist.
In place in ( base Python): 11.89 seconds In place in (Python Joblib): 4.42 seconds In place in ( Python Numpy): 0.93 seconds In place in ( Python Numba): 0.49 seconds
Schließlich habe ich mich für die Basis R für die Fahrt im selben Beispiel entschieden:
nwas zu folgendem Timing-Ergebnis führte:
Time in base R: 1.30 secondsIm Vergleich zu den Perl-Ergebnissen fällt uns zu diesem Beispiel Folgendes auf:
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3