Где я могу найти эффективность O (n) некоторых методов Numpy?
Я делаю школьный проект, и они спросили об эффективности некоторых методов Numpy, и я не могу их найти. Кто-нибудь может сказать мне, где я могу их найти?
Примеры методов, таких как:
numpy.linspace(x,y,z)
numpy.meshgrid(x,y)
numpy.zeroes(x,y)
1 ответ:
Вы можете просто измерить время выполнения для различных размеров задачи, чтобы получить оценку сложности времени,
numpy.zeros(n)
: недетерминированныеnumpy.meshgrid(x,y)
:O(n**2)
numpy.linspace(0, 1, n)
:O(n**1.6)
Например, ниже приведен код для измерения временной сложности для
numpy.meshgrid(x,y)
, который может быть использован и для других функций numpy,In [1]: import numpy as np ...: from time import time ...: import matplotlib.pyplot as plt ...: from scipy.optimize import curve_fit ...: %matplotlib inline ...: ...: def complexity_model(x, n, A, C): ...: return A*x**n + C ...: ...: problem_size = np.logspace(2, 4, 10) ...: ...: res = [] ...: for N in problem_size: ...: x = np.linspace(0, 1, N) ...: y = x.copy() ...: ...: t0 = time() ...: np.meshgrid(x,y) ...: dt = time() - t0 ...: res.append(dt) ...: ...: nn = np.logspace(np.log10(problem_size.min()), np.log10(problem_size.max()), 100) ...: ...: time_to_solution = np.asarray(res) ...: fig, ax = plt.subplots(1,1) ...: ax.loglog(problem_size, time_to_solution, 'o-b') ...: ...: mask = problem_size > 100 # ignore initial points ...: ...: popt, _ = curve_fit(complexity_model, problem_size[mask], ...: time_to_solution[mask], ...: p0=(1.0, 1.0, 0.0) ) ...: print(popt) ...: ax.loglog(nn, complexity_model(nn, *popt), '--k') ...: ...: ...: ax.set_xlabel('Problem size: N') ...: ax.set_ylabel('Time to solution [ 1.94816942e+00 1.40955397e-08 -7.33862899e-04]
, что дает следующую кривую,
Для достаточно большого массива размеры,
numpy.meshgrid(x,y)
имеет, таким образом, временную сложностьO(n**α)
, сα = 1.95 ≈ 2
.