Я всегда думал, что для понимания списка Python неявно используется многопроцессорная обработка, и чтение вопросов в стеке (например, этот ) также произвело на меня такое же впечатление.Тем не менее, вот мой маленький эксперимент:
import numpy as np
import time
# some arbitrary data
n = 1000
p = 5
X = np.block([[np.eye(p)], [np.zeros((n-p, p))]])
y = np.sum(X, axis=1) + np.random.normal(0, 1, (n, ))
n_loop = 100000
# run linear regression using direct matrix algebra
def in_sample_error_algebra(X, y):
beta_hat = np.linalg.inv(X.transpose()@X)@(X.transpose()@y)
y_hat = X@beta_hat
error = metrics.mean_squared_error(y, y_hat)
return error
start = time.time()
errors = [in_sample_error_algebra(X, y) for _ in range(n_loop)]
print('run time =', round(time.time() - start, 2), 'seconds')
время выполнения = 19,68 секунд
Во время выполнения этого кода все 6 (физических) ядер моего процессора работалидо 100%
Что еще более волшебно, когда я перешел от понимания списка к циклу for, произошло то же самое.Я думал с .append
, это должно было быть сделано последовательно.См. Ниже:
start = time.time()
errors = []
for _ in range(n_loop):
errors.append(in_sample_error_algebra(X, y))
print('run time =', round(time.time() - start, 2), 'seconds')
время выполнения = 21,29 секунд
Любые теории?
Python 3.7.2, numpy 1.15.4