Numpy-

arr = np.array([[1, 2, 3, 4]])
row = np.array([1, 2, 3, 4])
%timeit arr[0] = row
466 ns ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Liste python -

arr = [[1, 2, 3, 4]]
row = [1, 2, 3, 4]
%timeit arr[0] = row
59.3 ns ± 2.94 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each

Numpy ne devrait-il pas être la version la plus rapide ici?


Voici ce que je vise à faire -

arr = np.empty((150, 4))

while True:
     row = get_row_from_api() 
     arr[-1] = row
1
Dev Aggarwal 17 sept. 2020 à 14:08

2 réponses

Meilleure réponse

Oui, utiliser des listes python de cette façon serait certainement plus rapide, car lorsque vous affectez quelque chose à un élément de liste python, il n'est pas copié, seules quelques références sont réaffectées (https://developers.google.com/edu/python/lists). Numpy copie à la place tous les éléments du conteneur source vers celui cible. Je ne sais pas si vous avez besoin de tableaux numpy ici, car leur création n'est pas gratuite et les listes python ne sont pas si lentes à la création (et comme nous le voyons également lors de l'affectation).

1
Michael Solotky 17 sept. 2020 à 11:54

La sémantique sous-jacente des deux opérations est très différente. Les listes Python sont des tableaux de références. Les tableaux Numpy sont des tableaux des données elles-mêmes.

La ligne row = get_row_from_api() implique qu'une nouvelle liste a déjà été allouée.

L'attribution à une liste en tant que lst[-1] = row écrit simplement une adresse dans lst. Cela fait généralement 4 ou 8 octets.

Placer dans un tableau en tant que arr[i] = row copie des données. C'est un raccourci pour arr[i, :] = row. Chaque élément de row est copié dans le tampon de arr. Si row était une liste, cela entraîne une surcharge supplémentaire pour convertir des objets python en types numériques natifs.

N'oubliez pas qu'une optimisation prématurée est inutile. Vos gains de temps pour une méthode par rapport à l'autre seront probablement négligeables. En même temps, si vous avez de toute façon besoin d'un tableau plus tard sur la ligne, il est probablement plus rapide de pré-allouer et de prendre un petit coup de vitesse plutôt que d'appeler np.array sur la liste finale. Dans le premier cas, vous allouez un tampon de taille et dtype prédéterminés. Dans ce dernier cas, vous avez simplement différé la surcharge de copie des données, mais vous avez également encouru la surcharge d'avoir à déterminer la taille du tableau et le type de fichier.

1
Mad Physicist 17 sept. 2020 à 12:02