Я только начал использовать Numpy и заметил, что итерация через каждый элемент массива Numpy составляет ~ 4 раза медленнее, чем выполнение того же, но со списком списков. Теперь я знаю, что это побеждает цель Numpy, и я должен, если возможно, векторизовать функцию. Мой вопрос, хотя почему он на 4 раза медленнее. Это кажется довольно большой суммой.
Я провел тесты ниже, используя %timeit
import numpy as np
b = np.eye(1000)
a = b.tolist()
%timeit b[100][100] #1000000 loops, best of 3: 692 ns per loop
%timeit a[100][100] #10000000 loops, best of 3: 70.7 ns per loop
%timeit b[100,100] #1000000 loops, best of 3: 343 ns per loop
%timeit b.item(100,100) #1000000 loops, best of 3: 297 ns per loop
Я попытался использовать dis.dis
, чтобы увидеть, что происходит под капотом, но получил:
TypeError: don't know how to disassemble method-wrapper objects
Затем я попытался посмотреть исходный код Numpy, но не смог определить, какой файл соответствует доступу элемента массива. Мне любопытно, что объясняет дополнительные накладные расходы, и что еще более важно, как понять это для себя в будущем. Похоже, что python не может быть легко скомпилирован с кодом C, чтобы я мог видеть разницу. Но есть ли способ увидеть, какой байтовый код генерируется для каждой строки, чтобы понять смысл различий?