Performance 我在哪里可以找到一些Numpy方法的效率O(n)?

Performance 我在哪里可以找到一些Numpy方法的效率O(n)?,performance,numpy,processing-efficiency,Performance,Numpy,Processing Efficiency,我正在做一个学校项目,他们问了一些Numpy方法的效率,但我找不到。有人能告诉我在哪里能找到这些吗 示例方法如下: numpy.linspace(x,y,z) numpy.meshgrid(x,y) numpy.zeroes(x,y)您可以简单地测量不同问题大小的执行时间,以获得时间复杂性的估计值 numpy.zero(n): numpy.meshgrid(x,y):O(n**2) numpy.linspace(0,1,n):O(n**1.6) 例如,下面是测量numpy.meshgrid(

我正在做一个学校项目,他们问了一些Numpy方法的效率,但我找不到。有人能告诉我在哪里能找到这些吗

示例方法如下:

numpy.linspace(x,y,z)
numpy.meshgrid(x,y)

numpy.zeroes(x,y)

您可以简单地测量不同问题大小的执行时间,以获得时间复杂性的估计值

  • numpy.zero(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

我认为没有一个地方可以让你查到它们。您必须考虑算法实际执行的操作,以推断其复杂性。例如,
np.ones(n)
必须为n个浮点分配内存,然后在每个内存单元中写入1。总的来说,它必须写n个,所以你是在
O(n)
中。哦,我明白了。但是这不适用于meshgrid和linspace…我非常感谢你提供了这个深入的解决方案。选择它作为正确答案:)
numpy.zero(n)
O(1)
似乎可疑。这意味着您可以以某种方式比用
0
填充每个内存单元做得更好。你确定这是可能的吗?@cel是的,我也这么认为。大致上,它应该是相应内存分配的时间复杂度。然而,执行maloc的时间似乎不是确定的(见下图)。例如,
%timeit-n1 np.zero(100000)
在我的笔记本电脑上提供
30
160µs
之间的任何东西。我更新了答案以反映这一点。@rth,是的,我认为这是计时方法的局限性。在这种情况下,可能会发生奇怪的资源优化,这与算法本身的时间复杂性无关。