2015-05-24 32 views
2

我正在做一個學校項目,他們問了一些Numpy方法的效率O(n),我找不到它們。誰能告訴我哪裏可以找到那些?哪裏可以找到一些Numpy方法的效率O(n)?

實例的方法,如:

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

+1

我不認爲有一個地方你可以查找它們。您將不得不思考該算法實際做了什麼來推斷其複雜性。例如'np.ones(n)'必須爲n個浮點分配內存,然後在每個內存單元中寫入1。總共必須寫n個,所以你在'O(n)'中。 – cel

+0

哦,我明白了..但是這不適用於meshgrid和linspace,雖然... –

回答

3

你可以簡單地測量不同問題的執行時間大小得到的時間複雜度的估計,

  • numpy.zeros(n)non-deterministic
  • 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] 

其給出如下曲線,

enter image description here

對於足夠大的陣列尺寸,因此numpy.meshgrid(x,y)的時間複雜度爲O(n**α),其中α = 1.95 ≈ 2

+0

我非常感謝你爲這個深入的解決方案。選擇它作爲正確的答案:) –

+0

'numpy.zeros(n)':'O(1)'似乎是可疑的。這意味着你以某種方式可以比用'0'填充每個存儲單元更好。你確定這可能嗎? – cel

+0

@cel是的,我也這麼認爲。粗略地說,它應該是相應內存分配的時間複雜度。然而,執行maloc的時間似乎並不確定(參見[答](https://stackoverflow.com/a/398297/1791279))。例如,'%timeit -n 1 np.zeros(100000)'在我的筆記本電腦上給出了'30'和'160μs'之間的任何值。我更新了答案以反映這一點。 – rth