【问题标题】:When is the computational cost of applying a function convex?应用凸函数的计算成本是什么时候?
【发布时间】:2014-12-21 19:26:05
【问题描述】:

似乎我在 Pandas 中所做的很多事情在我拥有的数据量中具有凸计算时间成本(例如,1 行需要 1 秒,2 行需要 2.2 秒,4 行需要 6 秒,等等) .

为什么计算成本不会线性增加我拥有的数据量?比如我写的这个函数:

def fractrips1brand(trip): 
    # Get number of transaction rows for THIS sepcific consumer
    art = trip[trip.Item_Id.isin(insidegood)].Item_Id.nunique()
    output = pd.Series({'numinsidegoods': art })
    return output


gr_TILPS = TILPStemp.groupby('uniqueid')
output = gr_TILPS.apply(fractrips1brand)

似乎表现出这样的成本。

为什么不是O(n)

【问题讨论】:

  • 我能有一个可运行的例子吗?

标签: python pandas computation


【解决方案1】:

函数具有大于线性的时间复杂度是很常见的。 例如,排序具有O(n log n) 的复杂性。

gr_TILPS = TILPStemp.groupby('uniqueid')

groupbysorts the keys by default,所以这个调用至少有O(n log n)的复杂度。您可以使用关闭排序

gr_TILPS = TILPStemp.groupby('uniqueid', sort=False)

在 Pandas 0.15 和更早的版本中,Series.nunique (source) 调用 Series.value_counts (source) 默认情况下也会对值进行排序。所以这是另一个复杂度为 O(n log n) 的函数调用。由于这个发生在fractrips1brand,所以gr_TILPS.apply(fractrips1brand)的总复杂度至少是O(m n log n),其中m是组数。

更新:在下一版 Pandas(版本 0.16.0)Series.nuniqueshould be significantly faster

【讨论】:

  • 我认为我们对凸的定义不同。什么东西比非凸的线性增长更快?凸不仅仅意味着二次。假设 C(x) 是 x 行的计算时间函数。凸性我的意思是 C'(x)>0 , C''(x)>0
  • 对不起,我的错误。我在想凹不凸。尽管如此,超过线性的时间复杂度并没有什么不寻常的地方。例如,排序为O(n log n)
  • 太好了,计算复杂性是一个很好的信息,可以预测我的完整数据集执行需要多长时间。为什么它是 O(n log n)?我想我的问题是,为什么上述函数不会是 O(n)?
  • value_counts 在 nunique 中似乎是一个奇怪的选择,Series.unique() 没有排序,所以你可以调用 len (在 O(n) 中)?
  • @Andy:我同意nunique 不需要排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
  • 2019-07-08
  • 2020-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多