Python 应用凸函数的计算成本是多少?
似乎我在Pandas中做的很多事情在我拥有的数据量中都有凸计算时间成本(例如,1行需要1秒,2行需要2.2秒,4行需要6秒,等等) 为什么计算成本不会线性增加我拥有的数据量?例如,我编写的这个函数: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
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
不需要排序。