Python 应用凸函数的计算成本是多少?

Python 应用凸函数的计算成本是多少?,python,pandas,computation,Python,Pandas,Computation,似乎我在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.nuni

似乎我在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)

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

gr_TILPS = TILPStemp.groupby('uniqueid')
groupby
,因此此调用至少具有
O(n log n)
复杂性。您可以使用关闭排序

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

在Pandas 0.15及更早版本中,
Series.nunique
调用
Series.value\u计数
,默认情况下也会对值进行排序。这是另一个复杂度为O(n logn)的函数调用。由于这一点发生在
fractris1brand
中,因此
gr_TILPS.apply(fractris1brand)
的总复杂度至少为
O(mn log n)
,其中
m
是组数


更新:在Pandas的下一版本(版本0.16.0)
Series.nunique

我能举个可运行的例子吗?我想我们对凸的定义不同。什么东西比非凸的线性生长得快?凸不只是指二次的。假设C(x)是x行的计算时间函数。我所说的凸性只是指C’(x)>0,C’(x)>0对不起,我错了。我想的是凹的而不是凸的。不过,比线性时间复杂度更快的时间复杂度并没有什么不寻常之处。例如,排序是
O(n logn)
。很好,要知道计算复杂性,就可以预测执行完整数据集所需的时间。为什么它是O(n log n)?我想我的问题是,为什么上面的函数不是O(n)的直觉是什么?
value\u counts
在nunique中似乎是一个奇怪的选择,
Series.unique()
不排序,所以你可以直接调用len(在O(n)中)?@Andy:我同意
nunique
不需要排序。